数据库事务

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

概要

数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

当事务被提交给了数据库管理系统(DBMS),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

例子

某人要在商店使用电子货币购买100元的东西,当中至少包括两个操作:

  1. 该人账户减少100元
  2. 商店账户增加100元

支持事务的数据库管理系统transactional DBMS)就是要确保以上两个操作(整个“事务”)都能完成,或一起取消;否则就会出现100元平白消失或出现的情况。

但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统操作系统出错,甚至是存储介质出错等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志英语Transaction log以追踪事务中所有影响数据库数据的操作[1][2]

ACID性质

并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行[3]
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束[3]
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行[3]
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中[3]

SQL

SQL国际标准使用START TRANSACTION开始一个事务(也可以用方言命令BEGIN)。COMMIT语句使事务成功完成。ROLLBACK语句结束事务,放弃从BEGIN TRANSACTION开始的一切变更。若autocommitSTART TRANSACTION的使用禁止,在事务结束时autocommit会重新激活。

关系型数据库

关系型数据库传统上是由具有固定大小的字段和记录的表组成。对象数据库由可变大小的blobs(二进制大对象)组成,可能是可序列化的,也可能是结合了MIME类型的。关系型数据库和对象型数据库的基本相似之处是start, commitrollback

在启动事务后,数据库记录或对象会被锁定, 只读,或读写。然后才可以进行读写操作。一旦事务完全完成,变化就会被原子性地提交或回滚,这样在事务结束时就不会出现不一致的情况。

分布式事务

数据库系统实现分布式事务是指在多个节点上访问数据的事务。一个分布式事务在多个节点上执行ACID属性,可能包括数据库、存储管理器、文件系统、消息系统和其他数据管理器等系统。在一个分布式事务中,通常有一个实体协调所有的过程,以确保事务的所有部分都适用于所有相关系统。

参考文献

  1. ^ Elmasri Navathe著,张伶等译. 《数据库系统基础(第四版)》(Fundamentals of Database System (Fourth Edition)). 中国电力出版社. 2005年8月: 436页. ISBN 7-5083-3496-5. 
  2. ^ Jim Gray, Andreas Reuter 著,孟小峰、于戈 等译. 《事务处理:概念与技术》(Transaction Prossessing: Concepts and Techniques). 机械工业出版社. 2004年. ISBN 9787111126416. 
  3. ^ 3.0 3.1 3.2 3.3 王能斌. 《数据库系统教程(上册)》. 电子工业出版社. 2002年8月: 91~92页. ISBN 7-5053-7827-9. 

参见