简介
本文介绍数据库的事务的ACID。
事务具有ACID四个特性:原子性(Atomic)、一致性(Consistent)、隔离性(Isolation)、持久性(Duration)。
原子性(Atomic)
事务必须是原子工作单元,对于其修改数据,要么全部成功,要么全部失败。
一致性(Consistent)
说明
事务在完成时,必须使所有的数据都保持一致状态。
示例
用户A和用户B两者的钱加起来一共是700,不管A和B之间如何转账,两个用户的钱相加起来还得是700,这就一致性。
隔离性(Isolation)
说明
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
详解
在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
持久性(Duration)
说明
事务完成之后,对数据库中对应数据的状态变更就应该是永久性的,并不会被回滚。
详解
假如事务已经提交,但数据还为持久化,此时系统断电或者宕机,也能够根据事务日志对未持久化的数据重新进行操作,将其恢复到事务成功结束的状态。
预写式日志(Write-ahead logging,缩写WAL)机制
许多数据库通过预写式日志(Write-ahead logging,缩写WAL)机制,来保证事务持久性和数据完整性,同时又很大程度上避免了基于事务直接刷新数据的频繁IO对性能的影响。
在使用WAL的系统中,所有的修改都先被写入到日志中,然后再被应用到系统状态中。假设一个程序在执行某些操作的过程中机器掉电了。在重新启动时,程序可能需要知道当时执行的操作是成功了还是部分成功或者是失败了。程序可以检查log文件,对突然掉电时计划执行的操作内容跟实际上执行的操作内容进行比较。在这个比较的基础上,程序就可以决定是撤销已做的操作还是继续完成已做的操作,或者是保持原样。
请先
!