数据库原理 活锁死锁

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

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

   

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

避免活锁:

  采用先来先服务的策略

避免死锁:

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

3、预防死锁的方法?

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

存在的问题:

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

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

存在的问题:

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

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

4、死锁的诊断方法?

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

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

5、死锁的解除?

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

解锁总结

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

 

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值