标签:
https://www.percona.com/blog/2012/03/27/innodbs-gap-locks/
http://www.cnblogs.com/LBSer/p/5183300.html
http://www.cnblogs.com/bamboos/p/3532150.html
A 会话
USE memdb;
SHOW VARIABLES LIKE ‘%autocommit%‘;
SET tx_isolation=‘SERIALIZABLE‘;
SHOW VARIABLES LIKE ‘%tx%‘;
START TRANSACTION;
SELECT * FROM `abcdefg` WHERE def=19 AND ghi=19 AND jkl=19;
-- 暂停,等B窗口前半部分执行了在执行下一部分
INSERT INTO `abcdefg`(abc,def,ghi,jkl,mnp) VALUES(‘19‘,19,19,19,1);
COMMIT;
原因在mysql的行锁实现主要分为记录锁、Gap锁、Next-key锁等。
因为 SERIALIZABLE使用的是GAP锁,所以,insert时>=当前索引的所有记录都被加上了S锁,故此问题发生 。
这也是我们遇到的,非常纯粹的只有insert操作的死锁的例子,对于使用oracle、sql server的开发人员来说时,遇到时有时候相当的不理解。
具体见各类锁的区别http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html。
mysql并发insert deadlock分析以及解决,无delete/update/for update
标签:
原文地址:http://www.cnblogs.com/zhjh256/p/5757867.html