mysql 事务两阶段提交

Mysql 事务两阶段提交

overview

准确的说是使用innodb引擎的mysql事务的两阶段提交 redo-loginnodb引擎在存储引擎层面实现的

例表

1
2
3
4
create table t(
	id int primary key,
	c int
);

如下查询

1
2
update `t` set c=c+1 
where `id`=2;

有以下过程

image.png

两阶段提交的必要性

主要是保证redo-logbin-log的一致性。这种必要性体现在异常恢复上。 由常识我们知道 redo-log用于保证事务的原子性持久性,记录的是物理日志,由存储引擎实现 bin-log用于归档, 记录的逻辑日志,由mysql server 层实现

若不保证二者同步更新(不使用两阶段提交,即在二者之一完成之后立即提交事务),将出现以下两种情况

  1. redo-log -> commit -> bin-log 若在commitbin-log间异常重启,系统能根据redo-log恢复事务,bin-log于是实际上少了一条记录,这就影响了后续对bin-log的使用,如构建从库,恢复到某一检查点

  2. bin-log -> commit -> redo-log 若在commitredo-log间异常重启,系统无法恢复事务,而bin-log多了一条记录,而数据库里实际没有,以后用bin-log也会出现与原库不一样的问题

总结

redo-logbin-log都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

ref 丁奇《MySQL实战45讲》

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy