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 
                 |