Mysql 事务两阶段提交
overview
准确的说是使用
innodb引擎的mysql事务的两阶段提交redo-log是innodb引擎在存储引擎层面实现的
例表
| |
如下查询
| |
有以下过程

两阶段提交的必要性
主要是保证redo-log 和 bin-log的一致性。这种必要性体现在异常恢复上。
由常识我们知道
redo-log用于保证事务的原子性和持久性,记录的是物理日志,由存储引擎实现
bin-log用于归档, 记录的逻辑日志,由mysql server 层实现
若不保证二者同步更新(不使用两阶段提交,即在二者之一完成之后立即提交事务),将出现以下两种情况
redo-log->commit->bin-log若在commit和bin-log间异常重启,系统能根据redo-log恢复事务,bin-log于是实际上少了一条记录,这就影响了后续对bin-log的使用,如构建从库,恢复到某一检查点bin-log->commit->redo-log若在commit和redo-log间异常重启,系统无法恢复事务,而bin-log多了一条记录,而数据库里实际没有,以后用bin-log也会出现与原库不一样的问题
总结
redo-log和bin-log都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。
ref 丁奇《MySQL实战45讲》