数据库原理 活锁死锁
作者:互联网
1、封锁技术可以有效的解决并行操作一致性的问题,但是也带来了新的问题
- 活锁:某个事务被其它后来的事务抢占了,产生一直没有运行的现象
- 死锁:两个事务各自需要对方解决自己要操作的数据对象上的锁的权限,永久等待对方释放锁
2、如何避免活锁?死锁?
避免活锁:
采用先来先服务的策略
避免死锁:
死锁的预防(通过破坏死锁产生的条件使得不会发生死锁)、死锁的诊断和解除(允许发生死锁,但是定期的诊断和解除死锁)
3、预防死锁的方法?
一次封锁法:要求每个事务将要使用的数据全部加锁,否则就不能执行
存在的问题:
- 有些长事务的一些数据对象可能到比较后面才会用到,过早的加锁,影响系统的并发度。
- 难于确定封锁对象,数据库中的数据是不断变化的,原来不要求封锁的数据对象,在执行过程中可能要求封锁,这就要求对于可能加锁的数据对象加锁,使得本身不需要加锁的数据加锁,势必会让其它会用到该数据的事务等待,同时也进一步降低了系统的并发度。
顺序封锁法:预先对数据对象规定一个封锁顺序(例如B+树从根节点开始逐层分锁),所有的事务都按照这个顺序施行封锁
存在的问题:
- 维护成本:数据库中的封锁对象很多,并且随着数据库的插入删除操作等不断地变化,维护这样的资源封锁顺序非常困难,维护成本高。
- 难以实现:事务的封锁请求可以随着事务的执行而动态的决定,很难事先确定每一个事务封锁哪些对象,因此就很难按照规定的顺序去施加封锁。
预防死锁的小结:操作系统中广为采用的预防死锁的策略,并不适合数据库系统的特点,数据库系统在解决死锁的问题上,更普遍使用的是诊断并且解除的策略。
4、死锁的诊断方法?
- 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。优点是实现简单,缺点是有可能误判死锁,也有可能时限设置的太长,死锁发生之后不能即时的发现
- 等待图法:用事务等待图,反映所有事务的等待情况
并发控制子系统,周期性的生成事务等待图(比如每隔数秒),检测事务。如果图中发生了回路,就表示系统中出现了死锁。
5、死锁的解除?
- 选择一个处理死锁代价最小的事务,将其撤销
- 释放此事务持有的所有锁,使得其它事务能够继续运行下去
解锁总结
思考:顺序封锁法为什么能够防止死锁?
标签:封锁,事务,加锁,对象,数据库,死锁,顺序,原理,锁死 来源: https://blog.csdn.net/yky__xukai/article/details/104854516