数据库系统原理第十四章

1.事务的概念:

  • 事务是访问并可能更新各种数据项的程序执行单位。
  • E.g.将50美元从账户A转到账户B:
  1. read(A)
  2. A := A – 50
  3. write(A)
  4. read(B)
  5. B := B + 50
  6. write(B)
  • 两个问题需要解决:
    1.各种类型的故障,如硬件故障和系统崩溃
    2.多个事务的并发执行

2.事务的必需属性

  • 原子性:如果发生崩溃,应该保证不会更新,保持数据一致性。
  • 永久性:一旦用户被告知交易已经完成(即,50美元的转账已经发生),交易对数据库的更新必须持续,即使有软件或硬件故障。
  • 一致性:事务在开始执行时,必须看到一致的数据库。在事务执行期间,数据库可能会暂时不一致。当事务成功完成时,数据库必须是一致的.
  • 隔离性:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

3.事务状态

  • 活动状态:初始状态;事务执行时处于这个阶段。
  • 部分提交状态:最后一条语句被执行
  • 失败状态:发现正常的执行不能继续
  • 中止状态:事务回滚并且数据库已经被恢复到事务开始执行前的状态,中止后两个选择:1.重启事务:仅当内部没有逻辑错误时,2.杀死事务。
  • 提交状态:成功完成后。
    在这里插入图片描述

4.并发执行

  • 系统允许多个事务同时执行,好处是:
    1.增加处理器和磁盘利用率,导致更大的事务吞吐量。例如:当一个事务正在读写磁盘的时候,另一个事务可以使用CPU。
    2.减少平均响应时间:短的事务不需要在长事务之后等待。
  • 并发控制机制:实现隔离的机制。
    即,控制并发事务之间的相互影响以防他们破坏数据库的一致性。

5.调度

  • 调度:用于表示并发事务中的指令被执行的时间顺序的一个指令顺序。
    1.一组事务的一个调度必须包含这一组事务的全部指令。
    2.必须保持指令在各个事务中出现的顺序(不改变其顺序)
  • 一个成功完成执行的事务会用一个提交指令作为最后声明
    1.默认事务执行提交指令作为最后一个步骤。
  • 一个没能成功完成执行的事务会用一个终止指令作为最后声明。
    在这里插入图片描述

在这里插入图片描述

6.可串行性

  • 基础假设:每个事务都保证数据库一致性。
  • 故一系列事务的串行执行保证数据库的一致性。
  • 一个(可能是并发的)调度是可串行化的,如果它等价于一个串行调度。不同形式的等价调度引出了:
    1.冲突可串行性
    2.视图可串行性

7.事务的简化视图

  • 无视readwrite执行之外的操作。
  • 假设事务在读和写之间的本地缓冲区上可以对数据进行任意的计算。
  • 简化后的调度只包含readwrite指令。

8.指令冲突

  • 指令li和lj分别属于事务Ti和Tj,发生冲突当且仅当存在某些项Q被li和lj访问,且至少这些指令之一对Q进行写入.
    在这里插入图片描述
  • 直觉上,li和lj之间的冲突迫使它们之间有一个(逻辑的)时间顺序。如果li和lj在一个时间表中是连续的,并且它们不冲突,那么即使它们在时间表中互换了,它们的结果也将保持不变。

9.冲突可串行性

  • 如果调度S可以通过一系列非冲突指令的交换转换为调度S’,我们称S和S‘是冲突等价的。
  • 我们称调度S是冲突可串行化的,如果它冲突等价于一个串行调度。
    在这里插入图片描述
    在这里插入图片描述

10.可串行性判定

  • 考虑一些事务T1,T2,…Tn的调度。
  • 优先图 —— 一个有向图,其中的顶点是事务(名字).
  • 我们从 Ti 到 Tj 画一条弧,如果两个事务是冲突
    的, 且 Ti 先访问出现冲突的数据项。
  • 我们可以用访问的项来标记弧线。
    在这里插入图片描述
  • 这里有一个例子:
    在这里插入图片描述
    根据上面表中的冲突判断,只要两个事务中存在对一个数据的写操作,那么两个事务就是冲突的。比如T1和T2,对Y的访问,T2有写操作,所以T1和T2冲突,且T1先访问数据Y所以是T1指向T2,其余的类似。

11.冲突可串行性判定

  • 一个调度是冲突可串行化的当且仅当其优先图是无环的.
  • 环检测算法需要 n^2 数量级的运算, 其中 n 是图中顶点数.
    =>(更好的算法需要 n + e 数量级的运算,其中 e 是边数.)
  • 如果优先图是无环的, 串行化顺序可以通过图像的拓扑排序获得.
  • 如图可以将(a)序列转化为(b)或者(c)。
    在这里插入图片描述

12.可恢复调度

  • 需要撤销并发事务中失败的事务造成的影响。
  • 可恢复调度 — 如果一个事务 Tj 读取了以前由事务Ti 写入过的数据 , 则Ti 的提交操作出现在Tj 的提交操作之前.

13.级联回滚

  • 级联回滚 —— 一个单独的事务失败导致一系列事务回滚. 考虑下列事务,其中没有事务已经提交(所以该调度是可恢复的)。
    在这里插入图片描述如果 T10 失败了, T11 和 T12 必须被回滚.可能导致大量工作没有完成。

14.无级联调度

  • 无级联调度 — 不会发生级联回滚; 对满足 Tj 读取之前由Ti 写入的数据项的每一对事务 Ti 和 Tj,Ti 的提交操作出现在Tj 的读取操作之前。
  • 每个无级联调度也都是可恢复的。
  • 将调度限制为无级联调度是可取的。

15.并发控制

  • 数据库必须提供一个机制以确保所有可能的调度都是:
    1.冲突可串行化或者视图可串行化。
    2.可恢复且最好是无级联的。
  • 一次只执行一个事务的政策生成串行调度,但是并发程度很低
    1.串行调度是可恢复/无级联?
  • 在调度执行以后才判定可串行性有些太迟了。
  • 目标——改善能保证可串行性的并发控制协议。

16.一致性的弱级别

  • 一些应用愿意接受弱级别的一致性,允许一些非可串行化的调度。
    1.例如:一个只读事务想获得所有账户的近似总额。
    2.例如:为查询优化而计算的数据库统计可能是近似的。(为什么)
    3.这样的事务对于其他事务不需要是可串行化的。
  • 为了性能而权衡精确度。
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeUltraLab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值