数据库事务

这段时间笔试得比较多了,把一些自己薄弱的概念提出来归纳强化一下吧。

1. 事务的概念
    数据库事务是指作为单个逻辑工作单元执行的一系列操作。
    设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:

  · 更新客户所购商品的库存信息

  · 保存客户付款信息--可能包括与银行系统的交互

  · 生成订单并且保存到数据库中

  · 更新用户相关信息,例如购物数量等等

       正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
       数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。上面提到的一系列数据库操作,就可以看作是一个事务。

2.    事务的四大性质(ACID)
       事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性:

  · 原子性(Atomic)
       事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

  · 一致性(Consistence)
        事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。

  · 隔离性(Isolation)
        由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。

  · 持久性(Durable)
       事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

       企业级的数据库管理系统(DBMS)都有责任提供一种保证事务的物理完整性的机制。就常用的SQL Server2000系统而言,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。因此,我们不必关心数据库事务的物理完整性,而应该关注在什么情况下使用数据库事务、事务对性能的影响,如何使用事务等等。

3.     事务的两段提交概念
       事务的提交是一个过程,从开始提交到提交成功可分为部分提交阶段和提交阶段两个阶段,即两段提交。事务运行时有如下五种状态:
  (1) 活动状态 事务开始运行时被激活,就处于活动状态,直到事务被部分提交或失败。在这个状态,事务将执行对数据库的读写操作。但是,这时的写操作并不是立即写到磁盘上,一般是暂时存放在系统缓冲区。
  (2) 部分提交状态 事务中所有读写操作已经完成,事务进入部分提交状态。虽然操作执行完了,但对数据库的修改,很可能还存储在内存缓冲区。因此说事务还没真正的结束,而是进入了部分提交状态。
  (3) 失败状态 当一个事务无法正常运行下去时,该事务处于失败状态,数据库管理系统必须撤消它对数据库和其它事务的影响。
  (4) 异常结束状态 当撤消一个失败事务对数据库和其它事务的影响,并恢复到事务开始执行前的状态以后,该失败事务退出数据库系统,进入异常结束状态。
  (5) 提交状态 当一个事务成功地完成所有的操作,并且所有的操作对数据库的影响都已永久地存入数据库之后,该事务退出数据库系统,进入提交状态,正常结束。
  事务的状态图如图5.2所示。

    

  一个事务开始运行便立即进入活动状态,当执行最后一条语句时便进入部分提交状态。此时事务已经成功地完成它所有的操作,但操作结果还驻留在内存中,事务对数据库的影响还没有真正存入数据库,一个硬件错误仍有可能导致失败。而且,数据库恢复机构还要对这个事务进行其它方面的检查,确认它能否成功地结束。当事务已经满足各方面的要求,并且所有操作对数据库的影响都已经安全地存入数据库,则此时事务进入提交状态,成功地结束。
  若处于活动状态的事务未能正常执行某一操作,或者在部分提交过程中无法安全地将数据存入数据库,则事务进入失败状态。一个事务进入失败状态后,数据库管理系统首先撤消该事务的操作对数据库和其它事务的影响,然后使该事务进入异常提交状态。若事务进入异常提交状态,则必须根据其失败原因分别作出处理:
  如果事务失败是与事务无关的外部原因引起,如硬件故障或系统软件错误,则可重新启动该事务,使之作为一个新事务开始运行;
  如果事务失败是由事务内部的逻辑错误引起,如除零,则该事务的程序有错误,需要重写程序来纠正错误。此时,数据库系统废除失败的事务,并通知用户重写该事务程序。

4.    事务的隔离级别
       企业级的数据库每一秒钟都可能应付成千上万的并发访问,因而带来了并发控制的问题。由数据库理论可知,由于并发访问,在不可预料的时刻可能引发如下几个可以预料的问题:

  脏读:包含未提交数据的读取。例如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。

  不可重复读取:当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时,因为在同一个事务内的多次读取之间修改了该行,所以每次读取都生成不同值,从而引发不一致问题。

  幻象:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读取。

       如你所想,这些情况发生的根本原因都是因为在并发访问的时候,没有一个机制避免交叉存取所造成的。而隔离级别的设置,正是为了避免这些情况的发生。事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。

       根据隔离级别的不同,DBMS为并行访问提供不同的互斥保证。在SQL Server数据库中,提供四种隔离级别:未提交读、提交读、可重复读、可串行读。这四种隔离级别可以不同程度地保证并发的数据完整性:

隔离级别 脏 读 不可重复读取 幻 像
未提交读 是 是 是
提交读 否 是 是
可重复读 否 否 是
可串行读 否 否 否
       可以看出,“可串行读”提供了最高级别的隔离,这时并发事务的执行结果将与串行执行的完全一致。如前所述,最高级别的隔离也就意味着最低程度的并发,因此,在此隔离级别下,数据库的服务效率事实上是比较低的。尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不总是要求完全的隔离。例如,多个作者工作于同一本书的不同章节。新章节可以在任意时候提交到项目中。但是,对于已经编辑过的章节,没有编辑人员的批准,作者不能对此章节进行任何更改。这样,尽管有未编辑的新章节,但编辑人员仍可以确保在任意时间该书籍项目的正确性。编辑人员可以查看以前编辑的章节以及最近提交的章节。这样,其它的几种隔离级别也有其存在的意义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值