数据库事务的四大特性有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性
根据定义,原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账成功,要么转账失败,是不存在中间的状态!
隔离性
根据定义,隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性
根据定义,持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
一致性
根据定义,一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。
原子性要求事务中的一系列操作要么都要执行,要么都不执行,不会部分执行,是通过用undolog回滚日志来实现的(生成undolog时也会对undolog生成redolog确保完整生成undolog不丢失),事务执行失败或调用rollback时执行回滚操作将数据回滚成修改之前的操作。隔离性要求多个事务各个事务中的一系列操作对结果互相不覆盖不影响,是通过用锁和MVCC机制实现的。持久性要求事务的执行结果是已经被持久化了的,已经存在硬盘上了的。原子性,隔离性,持久性实现之后即实现了一致性。一致性有在数据库与应用两个层面的要求
undolog是逻辑日志,记录了回滚时需要执行的数据库操作的日志。
redolog是物理日志,是关系数据库数学模型结构在内存中的物理分页,比操作系统内存分页要小,是数据库数据在内存中的缓存,缓存数据被修改后会被标记为脏数据,之后会顺序写入磁盘,顺序写入执行效率要高,而非性能差的随机写入方式,之后会由数据库将已持久化到硬盘中redolog中的修改写到数据所改在的位置。
MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。
由于MVCC机制在可重复读(Repeateable Read)和读已提交(Read Commited)的MVCC表现形式不同,就不赘述了。
但是有一点说明一下,在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。
2PL:Two-Phase Locking
传统RDBMS加锁的一个原则,就是2PL (二阶段锁):Two-Phase Locking。相对而言,2PL比较容易理解,说的是锁操作分为两个阶段:加锁阶段与解锁阶段,并且保证加锁阶段与解锁阶段不相交。
即在一个事务之中可能有多次增删改操作,而在每次增删改操作时都是在追加一条锁定,之后在事务执行过程中一直保持对对象的锁定状态,而只有到事务提交时才会将全部锁定一起解锁。