数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
并非任意的对数据库的操作序列都是数据库事务。事务应该具有是4个属性:原子性、一致性、隔离性、持久性。这四个属性通常成为ACID特性。
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该是永久保存在数据库中。
如何理解ACID
举例说明,用一个常用的“A账户向B账户汇钱”的例子来说明如何通过数据库事务保证数据的准确性和完整性。
熟悉关系型数据库事务的都知道从账户A到账户B需要6个操作:
1、从A账户中把余额读出来(500)。
2、对A账户做减法操作(500-100)。
3、把结果写回A账户中(400)。
4、从B账户中把余额读书来(500)。
5、对B账户做加法操作(500-100)。
6、把结果写回到B账户中(600)。
原子性:
保证1~6所有过程要么全部执行,要么全部不执行。一旦在执行某一步骤的过程发生问题,就需要执行回滚操作。假如执行到第五步的时候,B账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。
一致性:
在转账之前,A和B账户中共有500+500=1000,在转账之后,A和B账户中共有400+600=1000,也就是说,数据的状态在执行数据操作之后从一个状态改变到了另一个状态,同时一致性还能保证账户余额不会变成负数等。
隔离性:
在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱是不会发生变化。如果在A向B转账的同事,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱,再加上自己原来的钱。
持久性:
一旦转账成功(事务提交),两个账户里面的钱就会真的发生变化(会把数据写入数据库做持久化保存)。
参考:Hollis