什么是事务

概述

事务是DBMS中业务操作的执行单位,事务的ACID性质是数据库一致性的基本保证。保障并发执行时事务满足ACID的技术就是数据库的并发控制,保障在数据库发生故障时依然满足ACID的技术就是数据库的故障恢复。并发控制和故障恢复是数据库系统管理的基本内容,所以事务概念和事务ACID性质也就成为了数据库管理的重要基础。

事务概念与性质

我们先来看一个例子:由账户A转账金额X到账户B。这是一个非常经典的例子。这个业务可以分解成2个基本的操作:

  1. 从A中减少金额X;
  2. 在B中添加金额X;

这2个动作构成了一个不可分割的整体,要么一起执行,要么都不执行。如果只执行前一个动作而忽略了后一个动作,那么将导致数据错乱。这种“不可分割”的业务单位对于数据库业务的并发控制和故障恢复非常重要、非常必要,这就是“事务”的基本概念。

事务概念

事务(transaction),是DBMS中的基本执行单位。根本特征在于集中了数据库应用方面的若干操作,这些操作构成一个操作序列,要么全做,要么全不做,整个序列是一个不可分割的“原子化”单位

在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。

事务性质

在数据库事务处理过程中,事务的正常状态是由“ACID”性质予以保证的。

  1. 原子性Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  2. 一致性Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  3. 隔离性Isolation):多个事务并发执行与这些事务单独执行的结果“等效”。当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  4. 持久性Durability):在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。

事务操作与状态

在数据库运行过程中,事务可以由下述的4个基本部分组成:

  1. 开始(begin):开始执行事务。
  2. 执行(read and write):事务对数据进行读或写操作。
  3. 提交(commit):事务完成所有操作,同时保存结果,标志着事务的成功完成。
  4. 回滚(rollback):事务未完成所有所做,重新返回到事务开始,标志着事务的撤销。

根据事务的上述操作,可以得到事务的各种状态:

  1. 活动状态(active):事务处于运行当中。
  2. 局部提交状态(partial committed):表明事务的最后语句已经被执行。
  3. 提交状态(committed):事务执行成功,执行结果写入到数据库中。
  4. 失败状态(failed):事务无法正常进行。
  5. 终止状态(abort):回到事务执行前的初始状态。

事务操作与状态之间的关系如下图:
事务操作与状态之间的关系

可以得出以下结论:

  • 事务一般由“事务开始”启动,到“事务提交”或“事务回滚”结束。
  • 在事务开始后,它不断做READ或WRITE操作,但此时WRITE操作仅将数据写入磁盘缓冲区,并不是真正写入到数据库中。
  • 在事务执行过程中会产生2种情况:一是顺利执行,此时事务继续执行其后的操作;二是产生故障等原因而终止。

SQL事务机制

事务处理语句

  1. 事务开始语句:BEGIN TRANSACTION.
  2. 事务提交语句:COMMIT TRANSACTION.
  3. 事务回滚语句:ROLLBACK TRANSACTION.
  4. 事务存储点语句:SAVE TRANSACTION, RELEASE TRANSACTION.

参考文档