MySQL实现事务靠的是4个核心组件:
-
Redo Log
-
Undo Log
-
锁
-
MVCC
这四个组件分别对应事务的ACID特性的不同方面,一致性是由原子性、隔离性、持久性共同作用实现的。
1.Redo Log保证持久性(D)
在事务提交时,基于WAL(预写日志)机制将修改先写到Redo Log再刷盘写磁盘数据页。
就算写数据页时宕机了,重启后通过重放redo log就能恢复数据,确保已提交的修改不会丢失。
2.Undo Log保证原子性(A)
每次修改数据前,先把原值以逻辑日志的形式存到undo log中。
事务回滚时,按undo log反向操作把数据恢复回去。
要么全做完,要么全撤销,不会出现改了一半的中间状态。
3.锁机制保证隔离性(I)的写-写并发
两个事务同时改同一行,必须一个等另一个释放锁,实现写-写互斥。
InnoDB的锁粒度精确到行级(基于索引实现),还有间隙锁防止幻读。
4.MVCC保证隔离性(I)的读-写并发
读操作不加锁,通过undo log构建的版本链找到自己应该看到的数据版本,主要适配InnoDB默认的可重复读隔离级别RR。
写的时候别人照样能读,读的时候别人照样能写,大幅度提升读写并发度。
一致性不是单独实现的,它是原子性 、隔离性 和持久性共同作用的结果。
数据从一个正确状态转移到另一个正确状态,中间不会出现不一致的中间态,同时满足业务的约束规则。
