什么是死锁
当两个事务互相之间需要等待对方释放资源时,如果系统不进行干预则会一直等待下去,也就是进行了死锁(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,事务2 等待事务3,事务3 等待事务1
总结: 锁是互斥锁,并且事务等待的时候保持获取的锁,数据库不剥夺事务锁并且形成环路条件。