ch14 数据库系统概念(第6版)第十四章事务
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
事务的简化视图
无视 read 和 write 指令之外的操作 假设事务在读和写之间在本地缓冲区中可以对数据进 行任意的计算. 简化后的调度只包含 read 和 write 指令.
指令冲突
指令 li 和 lj 分别属于事务 Ti 和 Tj , 发生 冲突 当且仅当存 在某些项 Q 被 li 和 lj 访问, 且至少这些指令之一对Q进行 写入. 1. li = read(Q), lj = read(Q). li 和 lj 不冲突. 2. li = read(Q), lj = write(Q). 冲突. 3. li = write(Q), lj = read(Q). 冲突 4. li = write(Q), lj = write(Q). 冲突 直观地, li 和 lj 之间的冲突关键在于其之间的(逻辑)时 间顺序.
其他呢?
视图可串行性判定*
用于冲突可串行性判定的优先图无法直接用于视图可串行 性判定.
视图可串行性的扩展判定在优先图大小上有指数级别的代价.
检测一个调度是否是视图可串行化的问题可以归结于NP 完全问题.
故极度不可能存在一种有效算法.
然而只检测一些视图可串行性的充分条件的实用算法仍然 可以被使用.
通常, 一致性要求包括
上述实例中的一致性要求: 执行事务之后 A 和 B 的总额不变
显式指出约束,例如主码和外码 隐式完整性约束 例如. 所有账户余额的总和, 减去贷款总和必须等于手头现金数 事务要求数据库的一致性. 在事务执行过程中,数据库可能暂时不一致 当事务成功完成之后,数据库必须是一致的 错误的事务逻辑会导致不一致
资金转移实例(续)
隔离性要求 — 如果在步骤3和6之间, 另一个事务 T2 被允许访问部分更新的数据库, 它将会面对一 个不一致的数据库 ( A + B 的和会小于应有的值 ). T1 T2
1. read(A) 2. A := A – 50 3. write(A) 4. read(B) 5. B := B + 50 6. write(B read(A), read(B), print(A+B)
• 读出 “脏”数据(dirty read)
用户 t1 t2 t3 t4 (时间) A X=40 X=X+30 rollback B X=70 用户A在t2把X增加30(尚没写入数据库),用户B在t3由数据缓存读出x=70,但 用户A在t4时撤消(Undo)了对X的修改,数据库中仍维持X=40.但用户B已把“脏 ”数据(X=70)取走。
一个没能成功完成执行的事务会用一个终止指令 作为最后声明
令 T1 为 从A向B转账$50, T2 为 从A向B转账 10%.
一个串行调度,T1 之后是 T2 :
调度 1
调度 2
一个串行调度, T2 之后是 T1
调度 3(可讨论)
令 T1 和 T2 是之前定义的事务. 下列调度不是串 行调度, 但是 等价于 调度 1.
会在第15章中学习, 在学习了并发执行的正确性概念之后.
调度
调度 – 用于表示并发事务中的指令被执行的时间 顺序的一个指令顺序
一组事务的一个调度必须包含这一组事务的全部指令 必须保持指令在各个事务中出现的顺序(不改变其顺序)
一个成功完成执行的事务会用一个提交指令作为 最后声明
默认事务执行提交指令作为最后一个步骤
视图可串行性(课外阅读)×
令 S 和 S´ 为两个具有相同事务集的调度. S 和 S´ 是 视图等价 的,如果对于每个数据项Q,都满足 下列三个条件
如我们所见, 视图等价也是单独基于 reads 和 writes .
1. 如果在调度 S中, 事务 Ti 读取了 Q的初始值, 那么在调 度 S’ 中Ti 也必须读取 Q的初始值. 2. 如果在调度 S 中事务 Ti 执行了 read(Q), 且读取的值 是由 Tj (如果有)产生的, 则在调度 S’ 中事务 Ti 也必 须读取 Q 的值,这个值由事务Tj 的同一个write(Q) 产 生. 3. 在调度S中执行了最后的write(Q) 操作的事务 (如果有) 必须也在调度 S’中执行最后的write(Q)操作.
数据库系统
上海交通大学计算机系 张忠能
zhang-zn@cs.sjtu.edu.cn
1
第14章:事务
第14章:事务
事务概念 事务状态 并发执行 可串行性 可恢复性 隔离性的实现 SQL中的事务定义 可串行性判定.
事务 是访问并可能更新各种数据项的一个程序执 行单元. 例如. 从账户A向账户B转账$50的事务:
如果 T8 中止, T9 就会读取(可能展示给用户) 一个不一致的数据库 状态. 故, 数据库必须确保调度是可恢复的.
级联回滚
级联回滚 – 一个单独的事务失败导致一系列事务 回滚. 考虑下列事务,其中没有事务已经提交(所 以该调度是可恢复的)
视图可串行性(续) (课外阅读)×
一个调度 S 是 视图可串行化 的,如果它视图等价于一个 串行调度. 每个冲突可串行化调度也都是视图可串行化的. 下方是一个视图可串行化但不是冲突可串行化的调度.
上述调度等价于怎样的串行调度? 每个不是冲突可串行化的视图可串行化调度有盲写操作.
其他可串行性概念
下方的调度和串行调度< T1, T5 >产生同样结果, 然而不是它的冲突等价或者视图等价.
问
用户 t1 A X=40 B x=40 t2
题
不能重复读(Non-Repeatable read) t3 t4 t5 t6 y=30 x+y=70 z=30 x+y+z=100 x=x+20 COMMIT
用户A,用户B分别读取X=40后,在t3用户A取出y=30并计算x+y=70在 t4时用户B把x增加20,并于t5把x(x=60)写入数据库。在t6时,用户A取 出z(z=30)并继续计算x+y+z=100.,但如果用户A为进行核算而把x、y、 z重读一次再进行计算,却出现x+y+z=120 (x已增加20)。
资金转移实例
从账户A向账户B转账$50的事务:
1. 2. 3. 4. 5. 6. read(A) A := A – 50 write(A) read(B) B := B + 50 write(B)
原子性要求
如果事务在步骤3之后,步骤6之前发生失败,钱可能会“丢失”,导致 数据库的不一致状态 失败可能由于软件或硬件问题 系统应该要确保部分执行的事务的更新不会反映在数据库中(要求全部)
例: (非冲突可串行化) S:r2(A);r1(B);w2(A); r2(B);r3(A);w1(B);w3(A);w2(B) 优先图 1 2 3
可恢复调度
需要撤销并发事务中失败的事务造成的影响. 可恢复调度 — 如果一个事务 Tj 读取了之前由事务Ti 写入 过的数据 , 则Ti 的提交操作出现在Tj 的提交操作之前. 下列调度 (调度 11) 不是可恢复的,如果T9 在读取之后立 刻提交
持久性要求 — 一旦用户被告知事务完成了 (即, 转账$50已经发生), 这次事务对数据库的更wenku.baidu.com就必 须是永久的,即使发生软件或硬件故障.
资金转移实例(续)
从账户A向账户B转账$50的事务:
1. 2. 3. 4. 5. 6. read(A) A := A – 50 write(A) read(B) B := B + 50 write(B)
事务状态
活动状态 – 初始状态; 事务执行时处于这个状态 部分提交状态 – 最后一条语句被执行. 失败状态 -- 发现正常的执行不能继续. 中止状态 – 事务回滚并且数据库已经被恢复到事 务开始执行前的状态. 中止之后的两种选择:
重启事务
仅当没有内部逻辑错误时
杀死事务
提交状态 – 成功完成后.
调度 3 可以通过一些非冲突指令的交换, 转换为 调度 6, 一个串行调度其中 T2 跟随 T1. 因此调度 3 是冲突可串行化的.
调度 3
调度 6
冲突可串行性(续)
一个不是冲突可串行化的调度实例:
无法在上述调度中交换指令来获得串行调度 < T3, T4 >, 或者串行调度 < T4, T3 >.
在调度 1, 2 和 3 中, 保证了 A + B 的总和.
调度 4(可讨论)
下列并发调度不保证 (A + B ) 的值.
调度 1
令 T1 为 从A向B转账$50, T2 为 从A向B转账 10%.
调度 3
调度 4
可串行性
基础假设 – 每个事务都保证数据库一致性. 故一系列事务的串行执行保证数据库的一致性. 一个 (可能是并发的) 的调度是可串行化的,如果 它等价于一个串行调度. 不同形式的等价调度引 出了: 1. 冲突可串行性 2. 视图可串行性
事务状态(续)
并发执行
系统允许多个事务同时运行. 好处是:
增加处理器和磁盘利用率, 导致更大的事务吞吐量
例如. 当一个事务正在读写磁盘的时候,另一个事务可以使用 CPU
减少平均响应时间: 短的事务不需要在长事务之后等待.
并发控制机制 – 实现隔离的机制
即, 控制并发事务之间的相互影响以防它们破坏数据库 的一致性
如果 li 和 lj 在一个调度中是连续的且不发生冲突, 即便在调度中对 它们交换顺序,结果也是相同的.
冲突可串行性
如果调度 S 可以通过一系列非冲突指令的交换转 换为调度 S´ , 我们称 S 和 S´ 是 冲突等价的. 我们称调度 S 是 冲突可串行化的,如果它冲突等 价于一个串行调度
冲突可串行性(续)
一个调度是冲突可串行化的 当且仅当其优先图是无环的. 环检测算法需要 n2 数量级的 运算, 其中 n 是图中顶点数. 如果优先图是无环的, 串行化 顺序可以通过图像的拓扑排 序获得.
(更好的算法需要 n + e 数量级 的运算,其中 e 是边数.)
这是一个线序,符合图的偏序 . 例如, 调度 A 的一个串行化顺序 是 T5 T1 T3 T2 T4
优先图及冲突可串行性判断
列出所有数据库元素 按序写出每个元素涉及的事务 画出每个元素优先图 归并各个优先图 判断是否有环
例: (冲突可串行化) S:r2(A);r1(B);w2(A);r3(A);w1(B);w3(A);r2(B);w2(B) 优先图:
1 2 3
S’:r1(B);w1(B);r2(A);w2(A);r2(B);w2(B);r3(A);w3(A)
决定这样的等价需要分析读写以外的操作.
考虑一些事务 T1, T2, ..., Tn 的调度 优先图 — 一个有向图,其中的顶点是事务(名字). 我们从 Ti 到 Tj 画一条弧,如果两个事务是冲突 的, 且 Ti 先访问出现冲突的数据项. 我们可以用访问的项来标记弧线. 示例 1
可串行性判定
冲突可串行性判定
1. 2. 3. 4. 5. 6. read(A) A := A – 50 write(A) read(B) B := B + 50 write(B)
事务概念
需要处理的两个主要问题:
多种系统故障, 比如硬件故障和系统崩溃 多个事务的并发执行
问
修改丢失
题
用户 t1 t2 t3 t4 (时间) A X=40 X=X-30 B X=40 X=X-20 假设用户A和B都读取X(X=40),然后分别把X减少30和20。用户A在t3把改后的 X(X=10)写入数据库。随后,用户B在t4把改后的X(X=20)写入数据库。于是,对 用户A而言,他的修改在t4处丢失了。
可以通过串行执行事务来确保隔离性
然而, 并发执行多个事务有很大好处, 之后介绍.
即, 一个接一个.
ACID特性
事务 是访问并可能更新各种数据项的一个程序执 行单元. 为了保证数据完整性,数据库系统必须确 保:
原子性. 事务的所有操作在数据库中要么全部正确反映出来要么 全部不反映. 一致性. 事务的隔离执行保证数据库的一致性. 隔离性. 尽管多个事务可以并发执行, 但每个事务必须感觉不到其 他并发执行的事务. 中间事务结果必须对其他并发执行的事务隐 藏. 即, 对任一事务对 Ti 和 Tj, 在 Ti 看来, Tj 或者在Ti 开始之前已 经停止执行, 或者在 Ti 完成之后开始执行. 持久性. 一个事务成功完成后, 它对数据库的改变必须是永久的, 即使系统可能出现故障.