关于间隙锁

MySql 码拜 9年前 (2016-05-06) 1236次浏览
所使用到的表:
关于间隙锁
该表中插入1,2,3,….,101
执行如下操作:
关于间隙锁
问题:
1.为什么session_1执行mysql> select * from emp where empid = 102 for update;后,出现的间隙锁只是102本身还是还有其他?
2.为什么session_2执行mysql>insert into emp(empid,…) values(201,…); 会出现加锁?
解决方案

5

1: for update  假如指明主键且主键存在则锁行,否则锁表
2:原因是建表时没有指定主键,102for update时锁表,所以插入数据时遇到表锁–等待

5

直接看官网的文档上关于 Next-Key lock 的说明就很清楚了
http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

5

引用:

看for update的字面意思感觉就挺能明白为啥insert的时候加锁了啊,而且应该是表锁,原因是mysql不确定你select完了后能否update这条记录的主键,假如你刚好update emp set empid=201;那么自然跟insert的那个冲突了。除非你能事先告诉mysql你select完后只更新102,就只会有行锁了。

next_key 锁会划分锁范围,例子中101–正无穷都加了同一个域的锁,假如更新在1到101中就是行锁了

5

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

看for update的字面意思感觉就挺能明白为啥insert的时候加锁了啊,而且应该是表锁,原因是mysql不确定你select完了后能否update这条记录的主键,假如你刚好update emp set empid=201;那么自然跟insert的那个冲突了。除非你能事先告诉mysql你select完后只更新102,就只会有行锁了。

next_key 锁会划分锁范围,例子中101–正无穷都加了同一个域的锁,假如更新在1到101中就是行锁了

确实是next_key锁导致的。不过感觉有点晕了,行锁和record lock、next_key lock、gap lock等是什么关系,总称吗

行锁是一类名称,record lock的实现是行锁 如对已存在id for update,gap lock 是域锁,更新范围数据时会加gap,next_key lock 是gap和record的组合,昨天刚看了官方文档,明确了很多概念

多谢指点。本人还有个疑问,就是mysql只提供表锁、s和x锁,而数据库引擎(例如Innodb)提供意向锁is和ix这种是吧,那么gap、next_key这种的实际上是在这四种所基础上实现出来的,是这样的吗。感觉各种各样的锁,概念好繁杂,他们之间的关系也很不清晰。同时哪些情况下会加那种锁,这个也很不清楚。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于间隙锁
喜欢 (0)
[1034331897@qq.com]
分享 (0)