数据库事务
概要
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
例子
某人要在商店使用電子貨幣購買100元的東西,當中至少包括兩個操作:
- 該人帳戶減少100元
- 商店帳戶增加100元
支援交易的資料庫管理系統(transactional DBMS)就是要確保以上兩個操作(整個「交易」)都能完成,或一起取消;否則就會出現100元平白消失或出現的情況。
但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统出錯,甚至是存储介质出錯等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作[1][2]。
ACID性质
并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。
SQL
SQL国际标准使用START TRANSACTION
开始一个事务(也可以用方言命令BEGIN
)。COMMIT
语句使事务成功完成。ROLLBACK
语句结束事务,放弃从BEGIN TRANSACTION
開始的一切变更。若autocommit被START TRANSACTION
的使用禁止,在事务结束时autocommit會重新啟用。
关系型数据库
关系型数据库传统上是由具有固定大小的字段和记录的表组成。对象数据库由可变大小的blobs(二进制大对象)组成,可能是可序列化的,也可能是结合了MIME类型的。关系型数据库和对象型数据库的基本相似之处是start, commit或rollback。
在启动事务后,数据库记录或对象会被锁定, 只读,或读写。然后才可以进行读写操作。一旦事务完全完成,变化就会被原子性地提交或回滚,这样在事务结束时就不会出现不一致的情况。
分布式事务
数据库系统实现分布式事务是指在多个节点上访问数据的事务。一个分布式事务在多个节点上执行ACID属性,可能包括数据库、存储管理器、文件系统、消息系统和其他数据管理器等系统。在一个分布式事务中,通常有一个实体协调所有的过程,以确保事务的所有部分都适用于所有相关系统。
参考文献
- ^ Elmasri Navathe著,张伶等译. 《数据库系统基础(第四版)》(Fundamentals of Database System (Fourth Edition)). 中国电力出版社. 2005年8月: 436页. ISBN 7-5083-3496-5.
- ^ Jim Gray, Andreas Reuter 著,孟小峰、于戈 等译. 《事务处理:概念与技术》(Transaction Prossessing: Concepts and Techniques). 机械工业出版社. 2004年. ISBN 9787111126416.
- ^ 3.0 3.1 3.2 3.3 王能斌. 《数据库系统教程(上册)》. 电子工业出版社. 2002年8月: 91~92页. ISBN 7-5053-7827-9.