1 / 31

第十三章 事务处理技术之一:并发控制技术 事务是数据库的一个操作序列,是数据库应用程序的基本逻 辑单元。事务处理包括并发控制和数据库恢复。并发控制机

M. 第十三章 事务处理技术之一:并发控制技术 事务是数据库的一个操作序列,是数据库应用程序的基本逻 辑单元。事务处理包括并发控制和数据库恢复。并发控制机 构用于控制多个事务的并发运行,避免相互干扰,保证每个 事务产生正确的结果。数据库恢复机构用于系统失败后的恢 复处理,确保数据库恢复到正确状态。 本章讨论并发控制技术。 第一节 并发控制的必要性 第二节 事务模型 第三节 事务调度与可串行性 第四节 基于锁的并发控制协议 第五节 时间印协议 第六节 其它并发控制技术 第七节 插入和删除操作. M1. 第一节 并发控制的必要性

diza
Download Presentation

第十三章 事务处理技术之一:并发控制技术 事务是数据库的一个操作序列,是数据库应用程序的基本逻 辑单元。事务处理包括并发控制和数据库恢复。并发控制机

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. M 第十三章 事务处理技术之一:并发控制技术 事务是数据库的一个操作序列,是数据库应用程序的基本逻 辑单元。事务处理包括并发控制和数据库恢复。并发控制机 构用于控制多个事务的并发运行,避免相互干扰,保证每个 事务产生正确的结果。数据库恢复机构用于系统失败后的恢 复处理,确保数据库恢复到正确状态。 本章讨论并发控制技术。 第一节 并发控制的必要性 第二节 事务模型 第三节 事务调度与可串行性 第四节 基于锁的并发控制协议 第五节 时间印协议 第六节 其它并发控制技术 第七节 插入和删除操作

  2. M1 第一节 并发控制的必要性 多个用户同时使用的数据库系统称为多用户数据库系统。 例如,由于飞机售票系统和银行通存通取业务系统均需要 同时处理多个用户提交的数据库事务,因此都属于多用户 数据库系统。 本章讨论的多用户数据库系统仅考虑单处理机。在这种情 况下,多个程序的并发运行实际是轮流交叉运行,任何时 刻至多仅一个程序在运行。运行中的程序在等待信息时被 挂起,让其它程序运行。当等待的信息到来而处理机空闲, 程序就在被挂起处恢复执行。一个存取或改变数据库内容 的程序的运行称为一个数据库事务,简称为事务。对多个 同时运行的事务需要适当控制,这不但可以减少处理机的 空闲时间,提高系统效率,而且可以避免发生一些错误。 下边三个例子说明,对并发运行的多个事务如果不加以适 当控制将会引起一些问题。 接下页

  3. M11 对并发不加控制而引起问题 例1:数据更新丢失问题 设始值为x=80, n=5,m=4, 若按先T1后T2 或先T2后T1 的串行执行, 结果是x=79; 但按左边表格所示 的并发执行顺序, 结果却是x=84。 这个并发执行的结 果是错误的。 产生错误的原因是 T2在T1把更新数据 写入磁盘之前读x , 丢失T1对x更新结果 事务T1: {在x取出n, 加到Y上去} read(x); x=x-n; write(x); read(y); y=y+n; write(y). 两事务并发执行 事务T1 事务T2 read(x); x=x-n; read(x); x=x+m; write(x); read(y); write(x); y=y+n; write(y). 事务T2: {在x添加m} read(x); x=x+m; write(x). 接下页

  4. M12 对并发不加控制而引起问题 例2:临时值问题 事务T1读y失败, 本应恢复x, 但x已被T2更新, 故无法恢复x。 事务T1: {在X取出n, 加到Y上去} read(x); x=x-n; write(x); read(y); y=y+n; write(y). 两事务并发执行 事务T1 事务T2 read(x); x=x-n; write(x) read(x); x=x+m; write(x); read(y); 读y失败 事务T2: {在X添加m} read(x); x=x+m; write(x). 接下页

  5. M13 对并发不加控制而引起问题 例3:错误聚集计算问题 事务T1: 在x取出n,加到Y上去 read(x); x=x-n; write(x); read(y); y=y+n; write(y). 两事务并发执行 事务T1 事务T2 s=0; read(y); s=s+y; read(x); x=x-n; write(x); read(x); s=s+x; read(y); y=y+n; write(y). 事务T2累总 过程中受到 事务T1的干 扰,因而得 出错误结果 事务T2:累计x+y s=0 read(y); s=s+y read(x); s=s+s;

  6. M2 第二节 事务模型 1.事务的读写操作 事务的数据库操作只有如下两个: (1)read(x,y) 读取数据库中数据项x,存入程序变量y. 实现算法为: 1) 确定存放数据项x的磁盘块地址; 2) 若此磁盘块的数据未放入主存缓冲区, 则把它放入主存缓冲区; 3) 在主存缓冲区找到数据项x,存入程序 变量y. (2)write(y,x) 把程序变量y的值写入数据库中数据项x.实现算法为: 1) 确定存放数据项x的磁盘块地址; 2) 若此磁盘块的数据未放入主存缓 冲区,则把它放入主存缓冲区; 3)把程序 变量y的值放入主存缓冲区; 4)把主存缓冲区的内容写入磁盘。 接下页 主存 变量Y 数据库 读 磁盘块 数据项x 缓冲区 写

  7. M21 2. 事务的原子性 事务的原子性是指为使数据库保持正确状态而对事务作 出的如下要求: 事务中所有操作要么全部成功地完成并将结果存入磁盘, 要么放弃该事务并取消它对数据库和其它事务的影响。 满足事务原子性的主要方法是本章介绍的串行化技术。 事务的原子性被破坏有如下两种情况: 情况1:多个事务的操作交叉运行,未作合理控制。 情况2:事务在运行中被强行地停止。 为了防止发生情况1,DBMS必须对操作序列施加约束, 保证每个事务的原子性; 对于情况2,DBMS必须有能力撤销被强行停止的事务对 数据库和其它事务的影响。 接下页

  8. M22 3.事务的状态 事务在运行中的状态可以划分为如下五种: (1)活动状态:事务从开始到部分提交或失败; (2)部分提交状态:事务执行完最后一条语句end; (3)失败状态:事务被发现不能运行下去时; (4)异常结束状态:失败的事务撤销对数据库和其它事务 的影响后,退出数据库系统; (5)提交状态:成功的事务完成了所有操作并把对数据库 的影响存盘,之后退出数据库系统。 下图表示事务状态的转换,框图之间的文字表示操作: begin commit 提交 状态 部分提 交状态 活动 状态 end 存盘 执行完 成功吗? abort 失败 状态 异常结 束状态 未完成 撤消 影响

  9. M3 第三节 事务调度与可串行性 一 事务的调度 定义 N个事务的一个调度S是这N个事务所有操作的一个序 列,表示这些操作的执行顺序,并且满足: 任两个属于同一事务的操作i和j ,若i 先于j 执行, 则在调度S中,i 同样也先于j 执行。 根据调度的定义,可以知道: (1)事务内部的操作顺序,在事务加入调度之后保持不变; (2)不同事务的操作序列保持顺序并互相穿插构成调度。 如果在一个调度中,属于同一个事务的操作邻接地执行,则 把这一类调度称为串行调度。其它类型的调度(不同事务的 操作交错执行)称为并行调度。 并发事务可以组成许多调度,其中只有很少的调度是串行的。 例:设事务1为ABC,事务2为PQR (每个字母表示一个操作) 则ABCPQR 和 PQRABC 都是串行调度; ABPCPQ 和 PAQBCR 都是并行调度; ACPBQR 和 PABCRQ 都不是调度。 思考:此例有多少个调度?其中有多少个串行调度? 接下页

  10. 下边的例子说明不同调度的执行效果可能是不同的。下边的例子说明不同调度的执行效果可能是不同的。 例:设初始值为a=20,b=30 M31 T0T1 read(a); a:=a-10; write(a); read(b); b:=b+10; write(b); read(a); tmp:=a/10; a:=a-tmp; write(a); read(b); b=:b+tmp; write(b); T0T1 read(a); tmp:=a/10; a:=a-tmp; write(a); read(b); b=:b+tmp; write(b); read(a); a:=a-10; write(a); read(b); b:=b+10; write(b); T0T1 read(a); a:=a-10; write(a); read(a); tmp:=a/10; a:=a-tmp; write(a); read(b); b:=b+10; write(b); read(b); b=:b+tmp; write(b); T0T1 read(a); a:=a-10; read(a); tmp:=a/10; a:=a-tmp; write(a); read(b); write(a); read(b); b:=b+10; write(b); b=:b+tmp; write(b); 并行调度 串行调度     运行结束时 A=9,B=41 A+B=50 运行结束时 A=8,B=42 A+B=50 运行结束时 A=9,B=41 A+B=50 与相同 运行结束时 A=10,B=32 A+B=42结果错误 原因:状态不一致 接下页

  11. M32 二 调度的可串行性 若每个事务的程序是正确的,则多个事务的串行调度 (如下图)的运行结果也必定是正确的。 事务1 事务2 事务3 为充分发挥系统效能,我们希望多个事务并发运行,但前边已 有例子表明,并行调度可能产生与串行调度不同的效果,故需 要建立能保证与串行调度具有相同效果的控制方法。如何形成 并行调度才与串行调度等效?这是本节可串行性理论解决的问 题。可串行性理论有两个要点:  它主要关心数据库的读写操作,即read和write操作;  它的目的是研究如何形成一个可串行的并行调度,即‘等价’ 于一个串行调度的并行调度。下边介绍‘等价’的几个定义: 1 冲突等价性 2 效果等价性 3 状态等价性 接下页

  12. M33 1 调度的冲突等价性 冲突操作的定义: 若两个操作来自不同事务,但作用在同一个数 据项且至少一个是write,则称之为互相冲突。 不冲突操作性质: 若调度的两个相继操作来自不同的事务且互不 冲突,则交换它们的执行次序并不影响每个事 务的运行结果。 冲突等价性的定义: 若调度S1对来自不同事务的相继两个非冲突操 作交换次序变成调度S2,则称调度S1和S2是冲 突等价的。 冲突可串行定义: 若调度S冲突等价于某串行调度,则称之为冲突 可串行。此时S可以通过交换某些相继非冲突操 作变成串行调度。 接下页

  13. M34 例1 如下图的调度中, 1和2、3和4、5和6、7和8是不能交换的,因为同属一个事务。 2和3, 6和7能交换,因为它们作用于不同数据项,不冲突。 4和5不能交换,因为它们互相冲突。 因3和4不能移到6之下,7和8不能移到1之上, 故调度不是冲突可串行的。 T0 T1 read(a); a:=a-10; write(a); read(a); a:=a-1; write(a); read(b); b:=b+10; write(b); read(b); b=:b+1; write(b); T0 T1 1 read(a); 2 write(a); 3 read(b); 4 write(b); 5 read(b); 6 write(b). 7 read(a); 8 write(a). 例2 右图的调度是 冲突可串行的, 因为事务T1的 前三句可与事 务T0的后三句 交换。 接下页

  14. M35 2 调度的效果等价性 效果等价性的定义:若调度S1与S2执行 结果相同,则称它们效果等价。 等效可串行性的定义:若调度S效果等价 于串行调度,则称之为等效可串行。 两个调度若冲突等价则必具有相同效果, 但这个陈述反过来却未必正确,见下例。 该例调度是等效可串行,因为其结果和两 个串行调度(T0,T1)、(T1,T0)的结果都是: 帐号A把1元钱转到帐号B。 例如,对初值a=20和b=10,三个调度的处 理结果都是a=19,b=11. 注意该例调度不是冲突可串行,因为事务 T1的前三句不能下移到T0之后,而后三句 不能上移T0之前。 冲突可串行仅需分析read和write语句,故 存在有效测试;但等效可串行性却需要分 析所有操作,故测试复杂得多。 冲突等价 效果等价 T0 T1 read(a); a:=a-2; write(a); read(b); b:=b-1; write(b); read(b); b:=b+2; write(b); read(a); a:=a+1; write(a); 接下页

  15. M36 3 调度的状态等价性 状态等价性的定义: 若调度S1与调度S2满足下面条件, 则称它们是状态等价的: 对每个数据项Q, (1)若S1的事务T读Q的初值,则S2的事务T也读Q的初值。 (2)若S1的事务T读Q,则S2的事务T也读Q; 若S1中事务T1读到的Q值是事务T2产生的, 则S2中事务T1读到的Q值也是事务T2产生的。 (3)若S1中事务T执行最后的写Q操作, 则S2中事务T也执行最后的写Q操作。 冲突等价 效果等价 S2(T2,T3,T5) 状态可串行性的定义: 若调度S状态等价于串行调度, 则称之为状态可串行。 冲突可串行调度必然状态可串行, 但这个陈述反过来却未必正确。 右例调度S1与S2是状态等价的, 但S1不是冲突可串行。 T2 T3 T5 read(Q) write(Q) write(Q) write(Q) S1 接下页

  16. M37 • 调度可串性性测试 • 1 冲突可串行测试方法 • 前趋图概念G=(V,E) • 点集V:每个点表示一个事务; • 边集E:每个边(Ti ,Tj )表示访问同一个数据项Q的两个 • 事务Ti ,Tj,要求满足下列三条件之一(冲突方向): • (1) Ti写Q后,Tj读Q; • (2) Ti读Q后,Tj写Q; • (3) Ti写Q后,Tj写Q。 • 前趋图无回路冲突方向是单一的 • 调度是冲突可串行的 • N个事务调度前趋图的回路测试法需要时间为O(N2) • 2 状态可串行性测试 • 不存在有效算法。 • 标号前趋图测试回路的时间复杂性是问题大小的指数。 接下页

  17. M38 T0 T1 Read(A); A=A-50; write(A); Read(B); B=B+50; Write(B); Read(A); Tmp=A*0.1; A=A-tmp; Write(A); Read(B); B=B+tmp; Write(B); T0 T1 Read(A); Tmp=A*0.1; A=A-tmp; Write(A); Read(B); B=B+tmp; Write(B); Read(A); A=A-50; write(A); Read(B); B=B+50; Write(B); T0 T1 前趋图 前趋图 T1 T0 前趋图例 左图:两个事务对共同访问数据项的读写顺序,总是 T0先于事务T1,因此前趋图仅有T0指向T1的边。 右图:正好相反。 接下页

  18. M39 T0 T1 Read(A); A=A-50; Read(A); Tmp=A*0.1; A=A-tmp; Write(A); Read(B); write(A); Read(B); B=B+50; Write(B); B=B+tmp; 13-8 Write(B); T0 T1 Read(A); A=A-50; write(A); Read(A); Tmp=A*0.1; A=A-tmp; Write(A); Read(B); B=B+50; Write(B); Read(B); B=B+tmp; 13-7 Write(B); T0 T0 前趋图例 T1 T1 两个事务对共同访问数 据项的读写顺序,既有 T0先于T1,又有T1先于 T0,因此前趋图在T0和 T1之间有反向的两边。 两个事务对共同访问数据项的读写 顺序,总是T0先于T1,因此前趋图 在T0和T1之间有反向的两条边。

  19. M4 第四节 基于锁的并发控制协议 这类协议以事务等待的方式获得可串行性调度。 一 锁的概念 共享锁(S):若事务T得到数据项Q的共享锁, 则T对Q可以读但不可以写。 用LOCK_S(Q)表示。 互斥锁(X):若事务T得到数据项Q的互斥锁, 则T对Q可进行读和写的操作。 用LOCK_X(Q)表示。 用户访问数据项Q前必须对Q加锁, 前后两个用户对Q加锁必须遵守相容性约束: 若前用户对Q加S锁,则后用户只能加S锁; 若前用户对Q加X锁,则后用户不能加锁。 为了充分利用系统资源,用户应该适时释放所占有 的资源。释放资源的时机很重要,后边将举例说明, 过早或过迟释放资源都可能引发一些问题。 释放加在数据项Q上的锁,用UNLOCK(Q)表示。 接下页

  20. M41 T7 T8 Lock_x(B); Read(B); B=B-50; Write(B); Unlock(B); Lock_s(A); Read(A); Unlock(A); Lock_s(B); Read(B); Unlock(B); Disp(A+B); Lock_x(A); Read(A); A=A+50; Write(A); Unlock(A); 过早解锁造成数据库不一致的例 设初值为A=100,B=200。 事务T7的功能是把帐号 B的50元转到帐号A; 事务T8的功能是显示两 帐号的余额之和。 该调度为提高并发性而 尽早解锁,但后果是: T8访问的数据库不一致。 两事务串行调度时, T8显示总和为300元。 如使用上述调度, T8则显示250元。 故该调度是错误的。 接下页

  21. M42 前例由于过早解锁而出现了 数据库不一致的问题,那么 把解锁操作放最后又如何呢? 在左边的的例子种,这样处理 又产生了死锁问题。T10的第 三句等待T9解开B锁,把运行 的机会交给T9,但T9要对A加 互斥锁,要等待T10解开这个 锁,于是出现了互相无限期等 待的状态,使得两个事务都无 法进行。这种由于互相无限期 等待对方解锁而造成事务停顿 的现象称为死锁。 过迟解锁造成死锁的例 T9 T10 lock_x(B); read(B); b=b-50; write(B); lock_s(A); read(A); lock_s(B); lock_x(A);死琐 接下页

  22. M43 前两例告诉我们: 若为了提高并发性而尽快解锁, 则可能导致不一致的数据库状态; 若在申请其他锁之前不尽量释放已拥有的锁, 则可能导致死锁。 故应对并行事务的锁操作加以约束, 使事务能正常进行并保持正确状态,这就是锁协议。 我们将要学习与锁有关的三个协议: 锁协议:两段锁协议,数据库图协议; (后边还要介绍一个非锁概念的协议:时间印协议) ‘先于’概念:若调度中的两事务S和T一先一后地对数据项Q加锁 且两锁不相容,则称S先于T。记作ST. 调度的有向图:即按先于关系用箭头连接各事务结点所得的图。 调度的有向图与前趋图的区别: 前趋图根据的是不同事务对同一数据项读写的冲突性; 有向图根据的是不同事务对同一数据项加锁不相容性。 因读/写操作需加S/X锁,故两种图在冲突可串行性测试上很相似. 一个锁协议称为‘确保冲突可串行性’有向图无环 接下页

  23. M44 二 两段锁协议 两段锁协议规定:每个事务分为两阶段, 前阶段加锁而不解锁,后阶段解锁而不 加锁。其特点是:通过等待,实现(冲突) 可串行调度,但可能发生死锁。 1)按照两段锁协议,在上边的例子中, 考虑到后边有write语句,T11必须对 a1加x锁,无论哪个事务先行,由于 等待,只能产生串行调度,并发性低. 2)为提高并发性,有改进的两段锁协议: 加锁阶段增加upgrade语句:s锁升为x 锁,但可能要等待其它事务解s锁。 解锁阶段增加downgrade语句:把x锁 降级为s锁。见右边的中图。 3)若发生互相等待解锁,调度即陷入死 锁状态。造成死锁原因是两事务访问 数据项有不同顺序。见右边的下图。 T11 T12 read(a1); read(a1); read(a2); read(a2); write(a1); disp(a1+a2); L_s(a1); L_s(a1); read(a1); read(a1); L_s(a2); L_s(a2); read(a2); read(a2); upg(a1); unL(a1); write(a1); unL(a1); T9 T10 lock_x(B); lock_s(A); lock_s(B); lock_x(A); 死琐 接下页

  24. M45 三 数据库图协议 定义数据库图: 对于数据库DB,其数据库图是一个有向图G=(D,E),其中 D是有关数据项的集合,边(d1,d2)E当且仅当所有访问数 据项d1,d2D的事务都是先访问d1后访问d2的。 简单数据库图协议(树协议,仅使用X锁): 每个事务T对一个数据项最多只能加锁一次,而且遵循下 述规则:1)事务T的第一锁可加到任数据项; 2)数据项Q可被T加锁,仅当其父结点已被T加锁; 3)数据项任何时候可解锁; 4)被T解锁的数据项不再接受T加锁。 特点1:满足树协议的事务所构成的调度都是冲突可串行的; 特点2:数据库图是一个有向无环图; 特点3:由于构成调度的不同事务访问数据项的顺序是一致的, 故不会发生互相等待解锁的现象,从而保证调度是无死锁的. 接下页

  25. M46 例:遵守数据库图的四个事务 T13:lock(B); lock(E);unlock(E); lock(D); unlock(B);lock(G);unlock(D); unlock(G).BEDG T14:lock(D);lock(H);unlock(D);unlock(H).DH T15:lock(B);lock(E);unlock(E);unlock(B).BE T16:lock(D);lock(H);unlock(D);unlock(H).DH 上述四个事务均按下边数据库图遵守树协议, 所形成的调度是冲突可串行且无死锁的。 A T14 树协议的优点是 较早解锁,提高 并行性并避免死 锁;缺点是要对 某些无关数据项 加锁。 有向图 前趋图 B C 数 据 库 图 T13 D E F T15 T16 G H I 形成的调度见下页 接下页

  26. T13 T14 T15 T16 Lock(B) lock(D) lock(H) unlock(D) Lock(E) unlock(E) lock(D) unlock(B) lock(B) lock(E) unlock(H) lock(G) unlock(D) lock(D) lock(H) unlock(D) unlock(H) unlock(E) unlock(B) unlock(G) M47 上页例子形成的调度 按序访问有向图无环 冲突可串行及无死锁 数据库图协议是确保冲 突可串行性的协议 T14 有向图 前趋图 T13 T15 T16

  27. M5 第五节 时间印协议 事务T的时间印TS(T)定义为关于事务启动时刻的某个增函数。 例如TS(T)可定义为事务的启动时刻。T启动得越迟,TS(T)就越大。 每个数据项Q有两个动态时间印: W_TS(Q)表示写Q的各个事务中的最大时间印; R_TS(Q)表示读Q的各个事务中的最大时间印。 时间印协议: 1)当事务T要求执行读Q, 若TS(T)<W_TS(Q),则放弃T, 否则,执行并修改R_TS(Q)=MAX(R_TS(Q),TS(T)). 2)当事务T要求执行写Q, 若TS(T)<R_TS(Q), 或TS(T)<W_TS(Q),则放弃T, 否则,执行并修改W_TS(Q)=MAX(W_TS(Q),TS(T)). 被放弃的事务将获得新的时间印并重新执行。 由于新的时间印具有更大的值,故重启事务更易获准执行。对时间 印较小的事务实行放弃并重启,使冲突操作顺序与事务启动顺序一 致,保证冲突可串行性。又因不要求事务等待,故不引起死锁。 Q写印 T印须在Q写印之后 Q写印 Q读印 T印须在Q读印和Q写印之后

  28. M6 第六节 其它并发控制技术 一 实现并发控制的验证技术 前述各法对每操作都须检查(锁或时间印),故速度慢。 验证技术:运行数据副本,验证各更新操作的冲突可串 行性。决定是提交(用副本数据更新数据库)还是放弃。 使用验证技术的时间印并发控制方法: 事务T所写的数据项集合w_set(T); 事务T所读的数据项集合 r_set(T); sr(T): 事务T始读时刻; fr(T):事务T终读时刻; sw(T):事务T始写时刻; fw(T):事务T终写时刻; 验证事务Ti : 扫描所有在线事务Tj,是否满足: fw(Tj)<sr(Ti ) (在Tj的写集和Ti的读集的交集中,j写后,i才读) fw(Tj)<sw(Ti )且r_set(Ti)与w_set(Tj)不交 (在Tj Ti的写集之交中,j写后,i才写) fr(Tj)<fr(Ti ), 且r_set(Ti)及w_set(Ti)都不与w_set(Tj)相交 (在Tj Ti的读集之交中,j读完后,i才读完) 若上述三条件之一成立,则无冲突,Ti被成功验证; 否则,可能发生冲突,放弃Ti,待以后重新启动。 两个变量集 四个时间印 接下页

  29. M61 二 多版本并发控制技术(时间印协议) 前述各法用推迟操作或放弃事务保证可串行性,本法建立 数据项D的版本系列。读D时,系统将选择D的正确版本。 本方法所用的符号: Ts(T):事务T的时间印(例如T的开始时刻); {Di}: 数据项D的版本集,每版本Di含三个数据域: (1)数据值= Di的值; (2)写印W_TS(Di):建立版本Di的事务印。注意不是写版 本Di的时刻,而是写Di事务的开始时刻。 (3)读印R_TS(Di)=max{TS(Tj)| Tj成功读取版本Di}。注意 这不是最新读Di 的时刻,而是读取Di的事务当中,最 大的事务印(最年轻的事务印)。 接下页

  30. M62 多版本并发控制 [协议]设事务T执行对数据项D的读写操作, 设Dk满足: 写印W_TS(Dk)=max{W_TS(Dj) | W_TS(Dj)<TS(T)}, (称Dk是D在T前最年轻的版本) 规则1:设T读D,则读到的是版本Dk的数据值; 读后更新读印R_TS(Dk); 规则2:设T写D,若读印R_TS(Dk)>TS(T),则放弃T, 否则建立D的新版本。 规则1保证事务T读到在时间上早于T的最新数据项版本; 规则2保证若事务T的写操作太迟,则拒绝写而放弃事务T。 该协议优点是读得快,不必等待; 缺点是读Dk时必须更新R_TS(Dk),故要写盘, 此外采取放弃事务来解决事务的冲突问题。 写印{Dj} Dk TS(T) 时间

  31. M7 第七节 插入和删除操作 前述各种并发控制方法仅考虑读写操作,本节讨论插 入和删除对并发控制的影响。基本原理是不能删除一 个不存在的数据项,也不能插入一个已经存在的数据 项。否则产生逻辑错误。为避免这类逻辑错误,对插 入删除操作作出约束。 一.删除操作对并发控制的影响 要建立约束防止数据项删除后的读写及删除操作。 对并发控制协议例如两段锁协议补充规定: 数据项必须先加互斥锁,然后才能删除。 二.插入操作对并发控制的影响 对数据项的插入操作实际上是分配初始值,要增加 约束为了防止插入前的读写操作。 三 插入元组现象 某事务的插入元组操作导致另一事务产生错误,这 类现象称为插入元组现象。可采用索引锁等技术防 止这类现象的出现。

More Related