您的位置:首页 > 数据库

数据库锁 for update

2015-07-30 11:12 465 查看
首先:发出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条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。

最后同样的 执行 kill 6 ,人工删除锁记录。那边被影响的记录就可以修改了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: