mysql delete 并发_mysql并发insert deadlock分析以及解决,无delete/update/for update

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;

USE memdb;

SHOW VARIABLES LIKE '%autocommit%';

SET tx_isolation='SERIALIZABLE';

SHOW VARIABLES LIKE '%tx%';

START TRANSACTION;

SELECT * FROM `abcdefg` WHERE def=18 AND ghi=18 AND jkl=18;

-- 暂停,等A窗口前半部分执行了在执行下一部分

INSERT INTO `abcdefg`(abc,def,ghi,jkl,mnp) VALUES('18',18,18,18,1);

COMMIT;

41aba9d2965a7955928d452a9b0199be.png

bfe28c6affd4496ce080e62bda548459.png

原因在mysql的行锁实现主要分为记录锁、Gap锁、Next-key锁等。

这三种锁定的范围不同,并且行锁不代表实现时锁定了所有已存在的符合where中明确说明的条件的行,还有可能包括隐式、不存在的记录。

因为 SERIALIZABLE使用的是GAP锁,所以,insert时>=当前索引的所有记录都被加上了S锁,故此问题发生 。

这也是我们遇到的,非常纯粹的只有insert操作的死锁的例子,对于使用oracle、sql server的开发人员来说时,遇到时有时候相当的不理解。

具体见各类锁的区别http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值