死锁的发生
sql大概是这样的
A1 update 表 set 字段 = (select * from 表 where 主键 = ‘’)…(再做某些处理)
A2 update 表 set 字段 = (select * from 表 where 主键 = ‘’)…(再做某些处理)
这条sql单独执行的时候没有问题,但当两条相同的主键都要update时就发生了死锁,最后分析如果有误望大神指正(MySQL,innodb)
A1 对 表加共享锁,
A2 也对 表 加共享锁,
当 A1 的 select 执行完时执行 update,
根据锁机制,
A1 的共享锁需要升级到排他锁才能执行接下来的 update
.在升级排他锁前,
必须等 表 上的其它共享锁,也就是A2释放,
同时,A2 也在等 A1 的共享锁释放。于是死锁产生了。
来源:https://blog.csdn.net/cuigaoshun/article/details/98874019