一、ACID特性保障

原子性(Atomicity)

通过undo log实现:事务操作前会生成逆向操作的undo日志,
若事务失败则通过undo日志回滚到初始状态。例如更新数据时,undo log会记录旧值用于回滚。

持久性(Durability)

依赖redo log实现:事务提交时,所有修改先写入redo日志(持久化到磁盘),
即使系统崩溃也能通过redo log恢复数据。

隔离性(Isolation)

锁机制:通过行锁、间隙锁等控制并发访问,防止脏读、不可重复读等问题。
MVCC(多版本并发控制):为每个事务生成数据快照(ReadView),
通过版本链实现非阻塞读,支持可重复读隔离级别。

一致性(Consistency)

由原子性、隔离性和持久性共同保障,确保事务执行前后数据库满足完整性约束。

二、核心实现组件

日志系统

redo log:记录事务修改后的数据,用于崩溃恢复。
undo log:记录事务修改前的数据,用于回滚和MVCC版本链构建。

缓冲池(Buffer Pool)

事务的修改操作先在内存缓冲池中进行,提升性能,再通过日志系统持久化。

事务ID与版本链

每个事务分配唯一ID,数据行通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)记录修改事务ID和回滚指针,
形成多版本数据链。

三、事务执行流程

1.事务启动:

分配事务ID,初始化undo log和redo log缓冲区。

2.数据修改:

内存中修改缓冲池数据,生成undo log。
记录redo log到缓冲区,事务提交时刷盘。

3.提交/回滚:

提交:redo log刷盘,释放锁,标记事务完成。
回滚:通过undo log逆向恢复数据。

四、隔离级别实现差异

读未提交:直接读取最新数据,无锁或快照控制。
可重复读(默认):通过MVCC生成事务级快照,结合间隙锁防止幻读。
串行化:使用表级锁强制事务串行执行。

总结:

MySQL事务通过undo/redo日志保障原子性与持久性,锁与MVCC实现隔离性,最终达成数据一致性。
不同隔离级别通过调整锁策略和版本控制平衡性能与数据安全。

高旭
40 声望3 粉丝