1 场景
一个事务中,需要用悲观锁锁多条记录(SELECT ** FOR UPDATE)。当有并发事务执行时,有可能发生死锁。
2 死锁概念
死锁是指多个进程(线程)因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程(线程)都将无法向前推进。
3 死锁的原因解析
假如存在这种情况,事务A需要先锁id为1的记录,再锁id为2的记录。事务B需要先锁id为2的记录,再锁id为1的记录。2个事务并发执行,就有可能发生死锁的情况。事务A锁了记录1,事务B锁了记录2,都在等对方释放自己的资源,从而产生死锁。
4 解决方案
- 设置锁超时时间、事务超时时间
- 资源排序,对要锁的记录排序,按相同的顺序申请锁
- 使用其他方案代替悲观锁For Update,比如乐观锁、缓存等
- 还看到一种方案,轮询锁,感兴趣的自行搜索