mysql 行锁演示

来源:互联网 发布:淘宝上内裤哪个牌子好 编辑:程序博客网 时间:2024/05/23 13:42
接上一篇,演示环境一样。 

我们看行锁的情况。 


首先:发出sql : 

set autocommit=0; 
select * from role where id=1 for update; 

由于innodb引擎支持行锁,因为id是主键(主键一定是索引),此时只会锁定 id=1的记录。 

然后看mysql锁定记录, 
发sql:SHOW PROCESSLIST; 

+----+------+-----------------+---------+---------+------+-------+-------------- 
----+ 
| Id | User | Host            | db      | Command | Time | State | Info 
    | 
+----+------+-----------------+---------+---------+------+-------+-------------- 
----+ 
|  6 | root | localhost:50898 | mybatis | Sleep   |    8 | NULL  | NULL 
    | 
| 19 | root | localhost:51403 | mybatis | Query   |    0 | NULL  | SHOW PROCESSL 
IST | 
+----+------+-----------------+---------+---------+------+-------+-------------- 
----+ 
可以看到有一条锁表记录。 

然后我们先修改其他行的记录,比如id=3记录。 

发sql: update role set seat=99 where id =3; 
mysql> update role set seat=99 where id =3; 
Query OK, 1 row affected (0.03 sec) 
Rows matched: 1  Changed: 1  Warnings: 0 

可以看到毫无影响。 


如果写操作涉及到本条记录呢? 
同样的,发出sql:update role set seat=90 where seat = 98; 
此时会影响到 id=1,id=22条记录,而id=1已经被我们锁定了。 

果然返回: 
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

结论:mysql innodb for update锁表如果where条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。 
0 0