并发事务死锁问题

文章目录

      • 1 场景
      • 2 死锁概念
      • 3 死锁的原因解析
      • 4 解决方案

1 场景

    一个事务中,需要用悲观锁锁多条记录(SELECT ** FOR UPDATE)。当有并发事务执行时,有可能发生死锁。

2 死锁概念

    死锁是指多个进程(线程)因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程(线程)都将无法向前推进。

3 死锁的原因解析

    假如存在这种情况,事务A需要先锁id为1的记录,再锁id为2的记录。事务B需要先锁id为2的记录,再锁id为1的记录。2个事务并发执行,就有可能发生死锁的情况。事务A锁了记录1,事务B锁了记录2,都在等对方释放自己的资源,从而产生死锁。
并发事务死锁问题_第1张图片

4 解决方案

  1. 设置锁超时时间、事务超时时间
  2. 资源排序,对要锁的记录排序,按相同的顺序申请锁
  3. 使用其他方案代替悲观锁For Update,比如乐观锁、缓存等

你可能感兴趣的:(java,多线程,数据库)