数据库原理 活锁死锁

1、*技术可以有效的解决并行操作一致性的问题,但是也带来了新的问题

  • 活锁:某个事务被其它后来的事务抢占了,产生一直没有运行的现象
  • 死锁:两个事务各自需要对方解决自己要操作的数据对象上的锁的权限,永久等待对方释放锁

数据库原理 活锁死锁   数据库原理 活锁死锁

2、如何避免活锁?死锁?

避免活锁:

  采用先来先服务的策略

避免死锁:

  死锁的预防(通过破坏死锁产生的条件使得不会发生死锁)、死锁的诊断和解除(允许发生死锁,但是定期的诊断和解除死锁)

3、预防死锁的方法?

一次*法:要求每个事务将要使用的数据全部加锁,否则就不能执行

数据库原理 活锁死锁

存在的问题:

  • 有些长事务的一些数据对象可能到比较后面才会用到,过早的加锁,影响系统的并发度。
  • 难于确定*对象,数据库中的数据是不断变化的,原来不要求*的数据对象,在执行过程中可能要求*,这就要求对于可能加锁的数据对象加锁,使得本身不需要加锁的数据加锁,势必会让其它会用到该数据的事务等待,同时也进一步降低了系统的并发度。

顺序*法:预先对数据对象规定一个*顺序(例如B+树从根节点开始逐层分锁),所有的事务都按照这个顺序施行*

存在的问题:

  • 维护成本:数据库中的*对象很多,并且随着数据库的插入删除操作等不断地变化,维护这样的资源*顺序非常困难,维护成本高。
  • 难以实现:事务的*请求可以随着事务的执行而动态的决定,很难事先确定每一个事务*哪些对象,因此就很难按照规定的顺序去施加*。

预防死锁的小结:操作系统中广为采用的预防死锁的策略,并不适合数据库系统的特点,数据库系统在解决死锁的问题上,更普遍使用的是诊断并且解除的策略。

4、死锁的诊断方法?

  • 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。优点是实现简单,缺点是有可能误判死锁,也有可能时限设置的太长,死锁发生之后不能即时的发现
  • 等待图法:用事务等待图,反映所有事务的等待情况

数据库原理 活锁死锁

并发控制子系统,周期性的生成事务等待图(比如每隔数秒),检测事务。如果图中发生了回路,就表示系统中出现了死锁。

5、死锁的解除?

  • 选择一个处理死锁代价最小的事务,将其撤销
  • 释放此事务持有的所有锁,使得其它事务能够继续运行下去

数据库原理 活锁死锁

数据库原理 活锁死锁

解锁总结

数据库原理 活锁死锁

思考:顺序*法为什么能够防止死锁?