1
xiaoxinshiwo 2018-11-07 16:12:47 +08:00
发生死锁是因为并发时唯一索引冲突导致;没这个前提并不会出现 insert 死锁的情况吧
|
2
gaius 2018-11-07 16:17:58 +08:00
也就跳主键
|
3
ziding 2018-11-07 16:20:47 +08:00
MySQL 我不确定,但是一个正规的关系数据库,连这个冲突都处理不了那就太 SB 了。回到问题中:锁是可以升级的,就你的例子中,2 和 3 会有一个获得写锁,而不是两个互傻等。数据库层面的死锁一般是由于写操作顺序不一致导致的,比如:
session1 update A -> update B |
4
ziding 2018-11-07 16:21:13 +08:00
MySQL 我不确定,但是一个正规的关系数据库,连这个冲突都处理不了那就太 SB 了。回到问题中:锁是可以升级的,就你的例子中,2 和 3 会有一个获得写锁,而不是两个互傻等。数据库层面的死锁一般是由于写操作顺序不一致导致的,比如:
session1 update A -> update B session2 update B -> update A |
5
abcbuzhiming OP @xiaoxinshiwo 没错啊,就是有唯一索引导致,实际开发中唯一索引很常见
@ziding MySQL 貌似就是处理不了,因为 1 个 session 要写和更新,需要获得排他锁,而排他锁和所有锁互斥,所以需要所有 session 都不持有锁,我说的案例里,两个 session 都持有共享锁,都去申请排他锁,他们都需要对方先释放掉共享锁,才能得到排他锁。所以就等在那死锁了。虽然说 MySQL 自己有死锁检测和处理,但是这个方式真的有点 2,而且 mysql 不认为这是 bug,它就是这么设计的 |
6
noNOno 2018-11-07 17:03:04 +08:00
数据库本来就是写少读多呀.
如果是做数据中转,读≈写 上消息队列 比如 kafka. |
7
xiaoxinshiwo 2018-11-07 17:23:44 +08:00
@abcbuzhiming #5 我的意思是唯一索引其实在业务中冲突的概率很低的
|
8
siroccoicode 2018-11-07 18:09:03 +08:00
唯一索引在业务中很常见,但是需要这样高并发地 insert、delete 具有唯一索引的业务场景不是很多。如果有,应该重新考虑这块表的设计了。我觉得这可能是需求 /场景发生概率和实现权衡取舍的结果。
|
9
glacer 2018-11-07 18:45:47 +08:00
对于你提到的场景,MySQL 内部有死锁检测机制能检测出事务 2 和 3 的死锁情况,并将已执行语句最少的事务回滚,所以这种死锁情况对性能影响应该是比较小的。https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlock-detection.html
|
10
ziding 2018-11-09 10:45:02 +08:00
@abcbuzhiming 还好我一直不吊 MySQL,这个实现不是 BUG,我也是醉了。也有可能 MySQL 的死锁检测算法比其他的 DB 都 NB,所以依赖死锁检测 :P
|