深入理解数据库事务

SMJ
loading... read

定义

事务(Transaction)在计算机术语中是数据库管理系统执行过程中的一个由一个有限的数据库操作序列构成的逻辑单位。 在数据库中以一致模式完成的任何逻辑计算都称为事务。

性质

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

  1. 提供可靠的工作单元,可以从故障中正确恢复并保持数据库一致,即使在系统故障的情况下(执行停止(完全或部分)并且对数据库的许多操作仍未完成且状态不明时)。
  2. 提供并发访问数据库的程序之间的隔离,以防止彼此的操作互相干扰。如果没有提供这种隔离,程序的结果可能是错误的。

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

ACID 特性

根据定义,数据库事务必须是原子的(它必须是完整的或没有任何影响)、一致的(它必须符合数据库中现有的约束)、隔离的(它不能影响其他事务)和持久的(它必须写入持久存储)。数据库从业者经常使用首字母缩写词 ACID 来指代数据库事务的这些属性。

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束,即系统获得有效的新状态或保持在先前状态。
  • 隔离性(Isolation):处理过程中事务与其他事务分开,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中,即使在系统出现故障后系统仍保持有效状态。

示例

张三要在商店购买 100 元的东西,当中至少包括两个操作:

  1. 张三账户减少 100 元
  2. 商店账户增加 100 元

原子性:

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

一致性:

交易完成,张三账户减少 100 元,商店账户增加 100 元

交易失败,张三账户和商店账户不变

隔离性:

如果张三在支付的同时,李四也在支付(是 50 元),那么即使李四取消支付,只要张三支付成功,商店账户也会增加 100 元,即不会影响张三的支付。

持久性:

交易完成,二者账户变化生效(写入数据库)

参考

http://www.hollischuang.com/archives/898

https://zh.wikipedia.org/wiki/数据库事务

https://en.wikipedia.org/wiki/Database_transaction

Sooner or later, everything ends.