事务四大特性
原子性(Atomicity)
事务中的所有操作要么全部完成,要么全部不执行。如果事务中的任何一步失败,整个事务都会被回滚,以保持数据的完整性。
一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。事务执行前后,数据库都处于一致的状态。这意味着事务必须遵循所有的数据完整性规则,如外键约束、唯一性约束等。一致性也与业务规则有关,比如银行转账,不论事务成功还是失败,转账双方的总金额应该是不变的。
隔离性(Isolation)
多个事务并发执行时,每个事务之间的操作互不影响,这通过不同的隔离级别来实现。
持久性(Durability)
一旦事务提交,其结果就会永久保存到数据库中,即使发生系统故障或崩溃也不会丢失。
InnoDB引擎中,这些特性是如何实现的呢?
原子性:
通过Undo Log实现事务的原子性,当事务开始时,MySQL 会在undo log中记录事务开始前的旧值。如果事务执行失败,MySQL 会使用undo log中的旧值来回滚事务开始前的状态;如果事务执行成功,MySQL 会在某个时间节点将undo log删除。
隔离性:
隔离性的实现相对比较复杂,不同的隔离级别对应不同的实现方式。主要通过MVCC和锁机制来实现隔离性。
持久性:
InnoDB使用重做日志(Redo Log)来保证事务的持久性,即使在事务提交后遇到系统崩溃,也能从日志中恢复数据。
redo log 是一种物理日志,当执行写操作时,MySQL 会先将更改记录到 redo log 中。当 redo log 填满时,MySQL 再将这些更改写入数据文件中。
如果 MySQL 在写入数据文件时发生崩溃,可以通过 redo log 来恢复数据文件,从而确保持久性(Durability)。
一致性:
通过事务的ACID属性整体保障,特别是在事务结束时通过提交或回滚操作来维护数据的一致状态。