【MySQL】innodb行锁变表锁
        【摘要】 
                    
                        
                    
                    关于下文中的表格看法,按照时间轴排列的  
 
 InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁 在不通过索引...
    
    
    
    关于下文中的表格看法,按照时间轴排列的
 
InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁
在不通过索引(主键)条件查询的时候,InnoDB是表锁而不是行锁。
创建表
创建一个没有主键的表
CREATE TABLE `test_no_key` (
`f1`  int(11) NOT NULL ,
`f2`  varchar(11)  DEFAULT NULL 
)
ENGINE=InnoDB
  
 - 1
 - 2
 - 3
 - 4
 - 5
 
插入俩条数据
insert into from test_no_key (f1,f2) values (1,2);
insert into test_no_key (f1,f2) values (2,2);
  
 - 1
 - 2
 - 3
 - 4
 
开启俩个进程

案例1
就是在没有使用索引的情况下InnoDB就会使用表级锁(共享锁不会有这个情况)
| 进程1 | 进程2 | 
|---|---|
| begin | begin | 
![]()  | 
    ![]()  | 
   
![]()  | 
    |
会出现等待![]()  | 
   |
进程1执行提交![]()  | 
    |
![]()  | 
   
案例2
给表加上主键
 
 这个测试可以看到,当有主键时,是行锁,只会对一条数据进行加锁
| 进程1 | 进程2 | 
|---|---|
![]()  | 
    |
![]()  | 
   |
![]()  | 
   
案例3
如果查询的条件没有带索引,那么行锁则会转为表锁即时表中字段有主键;所以在查询的时候建议使用索引字段查询
查看表数据
 
| 进程1 | 进程2 | 
|---|---|
![]()  | 
    |
![]()  | 
   |
![]()  | 
    |
![]()  | 
   
文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/fangkang7/article/details/97791965
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            












           
评论(0)