3-事务并发调度

1. 事务并发

(1) 概念:在某一个时间段内,多个事务同时存取相同的数据库数据。
(2) 并发操作时由于不能隔离而产生的问题:

  • 丢失修改:A修改无效。在这里插入图片描述
  • 读入的数据时脏数据
    在这里插入图片描述
  • 不可重复读
    在这里插入图片描述

2. 并发调度

简单来说就是并发的事务的命令按照时间顺序组成的一个执行序列,叫做并发调度

(1) 串行调度:按照串行的方式执行的。效率较低,一个事务执行必须等到另一个事务结束。

(2) 一致性调度:调度如果执行,能够让数据库从一个正确的状态(一致性)装换成另一个一致性的状态。

一致性状态:事务在执行的过程中,变量的状态变化是一致的。


3. 可串行化调度

设:T = {T1, T2, …, Tn} 是一组并发执行的事务,S 是 T 的一个串行调度,而 S’ 是 T 的一个调度。若 S’ 是与 S 有着相同一致性状态的一个调度,则称 S’ 是一个可串行化调度。

下列始终先执行T2,在执行T1,所以是一致的。
在这里插入图片描述
在这里插入图片描述


4. 冲突可串行化(一致性调度)

哪些执行命令产生冲突呢?
在这里插入图片描述
在这里插入图片描述

冲突可串行化的判断:优先图
优先图由节点和有向弧组成,节点表示事务,有向弧表示事务的先后次序。事务的先后次序由冲突动作的先后次序决定。

若有向弧无环,表示可串行化;否则是不可串行化。


5. 基于封锁的并发控制机制
  1. 锁的基本形式
  • 共享锁(S锁):允许执行读操作。
  • 排他锁(X锁):允许执行读/写操作。
  1. 锁的调度策略
  • 解除一个数据对象的排他锁之前,其它事务不能对它加任何锁。
  • 一个数据对象允许加几个共享锁,但不能在共享锁之上,加排他锁。
  1. 锁的相融矩阵
    在这里插入图片描述

  2. 加锁产生的问题

  • ① 正确加锁产生错误结果
  • ② 产生死锁现象
  • ③ 产生饿死现象:对等待的事务赋予优先权,当优先级达到一定程度时不允许其它类型的锁加入。

6. 两阶段锁协议

所有事务分两个阶段提出加锁和解锁请求:
① 增长阶段:事务可以获得锁,但不能解锁;
② 缩减阶段:事务解锁,但不能获得锁。

遵循了两阶段锁协议的并发控制算法所产生的调度是冲突可串行调度

解决了正确加锁却产生错误结果的问题,但是仍存在死锁现象,级联回滚可能发生。


7. 强两阶段锁协议

要求事务提交之前不得释放任何锁。大部分数据库系统采用严格两阶段锁协议或强两阶段锁协议。但是这两种锁并行程度很低,有时为提高并行能力,采用锁转换机制,在写的时候将S锁转换成X锁,写完后再降为S锁。


8. 多粒度锁及意向锁
  1. 多粒度锁的特点:
  • 显示加锁:树上每个结点都可以单独加锁
  • 隐式加锁:对当前节点加锁会导致隐式地对全部后代结点加上同类型的锁。

检查锁冲突时,必须检查祖先、后代节点。

  1. 意向锁:一个事务对一个数据对象显示加锁前,须对它的全部祖先节点加意向锁。如果说一个节点上有意向锁,则它的后代节点被显示加锁

意向锁分类:

  • IS 锁:对某节点加 IS,那么将对后代显示加 S 锁;
  • IX 锁:对某节点加 IX,那么将对后代显示加 X 锁;
  • SIX 锁:对某节点加 SIX,那么将对后代显示加 S 锁, 而且还加了 IX 锁,即,SIX = S + IX;
  1. 可串行多粒度锁协议:
  • 必须遵守锁类型的相容性矩阵
  • 根节点必须先加锁
  • 任何事物都必须遵守两阶段锁协议
  • 任何事物加锁都必须按从根到叶子顺序进行
  • 任何事物开锁都必须按从叶子到根顺序进行

9. 死锁的处理

封锁机制的实现是由锁管理器执行,锁管理器通过维护锁表控制加锁机制。

  1. 死锁: 两个或两个以上的事务都处于等待状态,每个事务都在等待其中另一个事务释放资源。

  2. 死锁的预防:

  • ① 抢占与事务回滚技术
  • ② 基于超时机制
  1. 死锁的检测:等待图

  2. 死锁的恢复:

  • 选择代价最小的事务
  • 回滚事务
  • 防止饿死,将其回滚次数考虑在代价中

10. 基于时间戳的调度协议
  1. 时间戳:每个事务在启动数据库系统会赋予这个事务唯一的时间标记,以标记事务的开始,这个时间标记为时间戳。这个时间标记可以是系统时钟或逻辑计数值。
  2. 时间戳基本原理:事务的时间戳决定串行化顺序,若 TS(Ti) < TS(Tj),则系统必须保证产生的调度等价于 Ti, Tj 串行调度。
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值