zoukankan      html  css  js  c++  java
  • 数据库事务处理的并发控制技术(二):事务模型

    一个存取或更改数据库的程序的运行成为数据库事务,简称事务。事务是数据库应用程序的基本逻辑单位。下面我们详细说事务的操作、状态和状态转换。

    1. 事务中的读写操作


    在并发控制和数据库恢复技术中,我们只需在数据项和磁盘块的级别上考虑事务中的数据库操作。在这个级别上,事务中的数据库操作只包括以下两个读写操作:

    1. READ(X, Y) 读取数据库中的数据项X,存入程序变量Y。
    2. WRITE(Y, X) 程序变量Y的值写入数据库中的数据项X。

    磁盘和主存储器之间的数据交换是以磁盘块为单位进行的。虽然数据项可能是一个数据库记录或更大的数据单位,数据项在多数情况下是数据库记录的一个数据域。

    READ(X, Y)的实现算法如下:

    1. 确定包含数据项X的磁盘块的地址A;
    2. 如果地址为A的数据不在主存缓冲区中,则把A所在磁盘块读入到主存缓冲区;
    3. 从主存缓冲区找到数据项X,存入程序变量Y。

    WRITE(Y, X)的实现算法如下:

    1. 确定包含数据项X的磁盘块地址A;
    2. 如果地址为A的数据不在主存缓冲区中,则把A所在磁盘块读入到主存缓冲区;
    3. 把程序变量Y的值存入磁盘块所在的主存缓冲区;
    4. 立即或以后把包含A磁盘块的缓冲区写到磁盘存储器。

    任何事务都使用如上定义的READ和WRITE操作读取数据库。

    2. 事务的原子性


    每个事务都必须满足如下的性质:该事务中的所有操作要么全部被成功完成并且这些操作的结果被永久的存储到数据库中,要么这个事务对数据库和其他事务没有任何影响。我们称这种性质为事务的原子性。保证事务的原子性是事务处理的重要目的。保证事务原子性的主要方法是“串行化”方法。事务的原子性可能遭到破坏的因素有如下两个:

    1. 多个事务并发时,不同事务的操作交叉运行。
    2. 事务在运行中间被强行停止。

    在第一种情况下,数据库管理系统必须保证多个事务的交叉运行不影响这些事务的原子性。在第二种情况下,数据库系统必须保证被强行终止的事务对数据库和其他事务没有任何影响。

    3. 事务的状态


    我们需要严格定义事务的“成功完成”等概念。所以必须考虑事务运行过程中的状态变化。一个事务必须处于如下状态之一:

    1. 活动状态 事务开始运行就进入活动状态,直到部分提交或失败。
    2. 部分提交状态 事务执行完最后一条语句,即执行完END-TRANSACTION命令之后进入部分提交状态。我们下面定义END-TRANSACTION命令。
    3. 失败状态 发现一个事务不能正常运行下去时,该事务进入失败状态,数据库管理系统必须消除它对数据库和其他事务的影响。
    4. 异常结束状态 当一个失败的事务对数据库和其他事务的影响被消除,数据库恢复到该事务开始执行前的状态以后,该事务退出数据库系统,进入异常结束状态。
    5. 提交状态 当一个事务成功完成了所有操作,并且所有操作对数据库的影响都已经永久存入数据库之后,该事务退出数据库系统,进入提交状态,正常结束。

    我们可以在事务中执行如下的操作来实现事务状态的转换:

    1. BEGIN-TRANSACTION 开始运行事务,使事务进入活动状态。
    2. END-TRANSACTION 说明事务中的所有读写操作都已经完成,使事务进入部分提交状态,把所有操作对数据库的影响存入数据库。
    3. COMMIT-TRANSACTION 标志事务已经成功完成,事务中所有操作对数据库的影响已经安全存入数据库,事务进入提交状态,结束事务的运行。
    4. ABORT-TRANSACTION 标志事务进入失败状态,系统消除事务中所有操作对数据库和其他事务的影响,结束事务的运行。

    除了以上操作外,有些数据库恢复技术还要求如下的一些操作:

    1. UNDO 消除事务中指定数据操作对数据库的影响。
    2. REDO 重新执行事务中指定数据库操作,保证该操作对数据库的影响能够安全存入数据库。

    下图给出了事务的状态转换图。一个事务在开始运行之后,立即进入活动状态。当它执行到最后一条语句,即END-TRANSACTION时,进入部分提交状态。此时,事务已经成功完成了它的所有操作。但是该事务的操作对数据库的影响还并没有真正的存入数据库,所以仍然可能失败。而且,并发控制和数据库恢复机制还要对这个事务进行其他方面的检查,确定它是否能够成功地结束。该事务已经满足并发控制和数据库恢复机制的要求,并且它的所有操作对数据库的影响已经安全存入数据库,进入提交状态,成功结束。处于活动状态的事务可能由于某些原因不能继续正常执行,这时,事务将进入失败状态。一个事务进入失败状态后,数据库管理系统首先消除该事务的操作对数据库和其他事务的影响,然后使该事务进入异常结束状态,并完成下述两项任务之一:

    1. 如果事务的失败是由该事务无关的外部原因引起的,如系统软件错误等,则可重新启动该事务,使之作为一个新的事务开始运行。
    2. 如果事务的失败是由事务内部的逻辑错误引起的,则该事务的程序有错误,需要重写程序来纠正错误。此时,数据库系统废除失败的事务,并通知用户重写该事务的程序。

    活动的事务也可以通过ABORT-TRANSACTION操作进入失败状态,终止自身运行。

    4. 事务的性质


    事务的性质需要数据库管理系统的并发控制和数据库恢复机制来保证。

    1. 原子性 事务是数据库系统运行的程序单元。每个事务的操作要么被全部成功执行,要么一个都不被执行。
    2. 数据库正确保持性 一个事务的正确执行必须把数据库从一个正确状态转换成另一个正确状态。
    3. 操作结果永久保持性 如果一个事务使数据库发生了变化,而且该事务已经进入提交状态,则这些改变不会因为以后的失败而丢失。
    4. 独立性 一个事务在进入提交状态之前,它对数据库的更新不可由其他事务读取,这个性质避免了上一篇随笔中说到的临时值问题,也避免了后面将讨论的嵌套回滚处理问题。一般来说,不同的并发控制和数据库恢复方法要求不级别的独立性。
    5. 可串行性 并发运行的多个事务的运行效果与这些事务按某种次序顺序执行的效果相同。可串行性是各种并发控制方法所要求的关键性质。

    保证事务原子性是数据库恢复机制的责任;数据库正确保持性是事务程序设计者的责任;操作结果永久保持性是数据库恢复机制的责任;独立性是数据库恢复机制的责任;可串行性是并发控制机制的责任。

    事务我们已经详细的说过了,那下次我们就讲事务的调度和事务调度的可串行性。

  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/isLiu/p/8350819.html
Copyright © 2011-2022 走看看