数据库事务调度的可恢复性和级联回滚

     对于一次调度其中涉及的相关事务,无论是什么原因,如果事务Ti失败了,为保证事务的原子性我们必须撤消该事务对数据库造成的影响,即将事务Ti回滚。同时由于系统中事务的并发执行,还必须确保那些依赖于Ti的任何事务Tj(即Tj读取了由Ti所写的数据)也必须同时撤消掉(即回滚掉)。

   (1)可恢复调度与不可恢复调度
     如图1所示,事务T7读取了事务T6所写的数据A,如果事务T6发生故障而回滚,就有可能引起T7的回滚,因此事务T6必须在T7提交之前进行提交,才能保证调度中事务是可恢复的。


图1

          对于可恢复调度,我们可以假设事务T7先提交,而事务T6后提交,事务T6在提交的过程中发生了故障,这时候事务T6可以回滚,而事务T7已经提交成为结束的事务,因此无法回滚,这势必造成调度中的事务无法恢复,因此事务T6必须先于事务T7提交,才能保证数据库在执行事务出现中断时,可以会滚到数据库 原来的状态。

  由上可以看出,对于每对事务Ti和Tj,如果Tj读取了由Ti所写的数据项,则Ti应先于Tj提交。我们把这样的调度称为可恢复调度。相反,如果在调度中,Tj读取了Ti写入的值,而且先于Ti执行提交操作,那么这个调度室不可恢复的。


(2)级联回滚和无级联回滚

     个人对级联回滚理解是这样的:有两个人(两个事务Ti和Tj),一个 好人(Tj),一个坏人(Ti),坏人(Ti)在某个人家里偷了钱(Ti执行读取操作),并将其收入囊中(Ti执行写操作),然后坏人将偷来的钱给好人花(Tj读取了Ti写入的数据项“偷的钱”),最后这个盗窃案被破获了(事务在执行中出现中断),坏人进了监狱(Ti开始回滚),好人也同样被逮捕了(Tj也开始回滚)。可以看出,好人受到了坏人的影响(两个事务之间产生了级联)。因此他们都会出现回滚。

    对于非级联回滚,可以简单的说他们之间没有相互产生“写”操作的影响。科学的解释如下:

   因一个事务故障导致一系列事务回滚的现象称为级联回滚,系统应该避免级联回滚。一个例子如图2所示,事务T9读取了事务T8写的数据A,事务T10读取了事务T9写的数据A,如果调度10的指令已经执行完事务T10的read(A),而这时事务T8发生了故障必须回滚,势必引起事务T9和T10的回滚。


图2


    级联回滚需要撤消大量的工作,而这是人们一般不希望发生的事情,所以,在数据库设计的时候要尽量避免级联回滚。

  为了避免调度中事务的级联回滚,对于每对事务Ti和Tj,如果Tj读取了由Ti所写的数据项,则Ti必须在Tj读取之前提交。我们把这样的调度称为无级联调度。至于为什么Ti必须在Tj读取之前提交,可以用可恢复调度中讲过的思路。



已标记关键词 清除标记
相关推荐
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页