所使用到的表:
该表中插入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,…); 会出现加锁?
该表中插入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时锁表,所以插入数据时遇到表锁–等待
2:原因是建表时没有指定主键,102for update时锁表,所以插入数据时遇到表锁–等待
5
直接看官网的文档上关于 Next-Key lock 的说明就很清楚了
http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
5
next_key 锁会划分锁范围,例子中101–正无穷都加了同一个域的锁,假如更新在1到101中就是行锁了
5
多谢指点。本人还有个疑问,就是mysql只提供表锁、s和x锁,而数据库引擎(例如Innodb)提供意向锁is和ix这种是吧,那么gap、next_key这种的实际上是在这四种所基础上实现出来的,是这样的吗。感觉各种各样的锁,概念好繁杂,他们之间的关系也很不清晰。同时哪些情况下会加那种锁,这个也很不清楚。