什么是死锁

当两个事务互相之间需要等待对方释放资源时,如果系统不进行干预则会一直等待下去,也就是进行了死锁(deadlock)状态。

示例

用户A

begin;
update t_local set col=1000 where id = 1;
update t_local set col=2000 where id = 2;

用户B

begin;
update t_local set col=2000 where id = 2;
update t_local set col=1000 where id = 1;

互相等待。。。

数据库一般会选择影响较小的一个事务出错以避免死锁

死锁的四个必要条件

  1. 互斥条件;

    某一个行锁只能有一个事务获取锁

  2. 请求与保持条件;

    两个事务互相等待锁,等待锁的时候仍然保持获取的锁

  3. 不剥夺条件;

    事务一直不提交,则一直占有锁

  4. 环路等待条件。

    事务1 等待事务2,事务2 等待事务3,事务3 等待事务1

总结: 锁是互斥锁,并且事务等待的时候保持获取的锁,数据库不剥夺事务锁并且形成环路条件。