doc: 阅读mysql 2pc实现

This commit is contained in:
asahi
2025-08-26 12:44:30 +08:00
parent a10ca0ad31
commit b649c1ec0c

View File

@@ -592,3 +592,29 @@ group commit通常用于提高事务处理系统的性能。group commit将多
##### group commit机制 ##### group commit机制
group commit允许多个事务合并为一次提交而不是每个事务单独提交。该方案会减少磁盘的io操作提高整体吞吐量。在高并发场景下相比于每个事务单独提交group commit机制能够显著提高性能。 group commit允许多个事务合并为一次提交而不是每个事务单独提交。该方案会减少磁盘的io操作提高整体吞吐量。在高并发场景下相比于每个事务单独提交group commit机制能够显著提高性能。
##### `binlog_order_commits`
`binlog_order_commits`为global variables并且无需停止server的运行就能对该变量进行设置。
如果该变量的值为`off(0)`,则代表事务可以被并行提交。在部分场景下,其能够带来性能的提升。
##### `binlog_max_flush_queue_time = microseconds`
##### binlog details
当server在执行事务时会收集事务造成的修改并将其存放到`per-connection``transaction cache`中。如果使用了statement-based replication那么statement将会被写入到transaction cache中如果使用了row-based replication那么row changes将会被写入到transaction cache中。一旦事务提交transaction cache将会作为一个single block被写入到binary log中。
上述的binlog写入流程能够令每个session都独立的执行每个connection都有其独立的transaction cache并且仅需在写入transaction data到binary log时加锁即可。由于事务之间是相互隔离的故而在提交时对事务进行序列化即可。
##### sync the storage engine and binary log
binlog机制mysql上层的和存储引擎无关而redo log机制是和存储引擎绑定的。为了对存储引擎和binlog进行同步server使用了2PC协议tow-phase commit protocol
<img src="https://img-blog.csdn.net/20161222103535710?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
如上图所示使用2pc提交协议是为了能够保证`要么事务同时位于engine和binlog中要么事务都不位于engine和binlog中`。故而,不应该出现`事务位于binlog却不位于engine中或事务出现在engine中却不出现在binlog中`的场景即使server在prepare后发生崩溃并后续恢复。
通过两阶段提交可以实现上述需要求一旦事务在engine中prepare其可以被完全提交或完全回滚即engine和binlog全部提交或全部回滚即使prepare后server发生崩溃并后续恢复。在recovery阶段存储引擎能够提供所有prepared但是尚未提交的事务并且之后
- 如果事务可以在binlog被找到那么事务将会被提交
- 如果事务在binlog中找不到那么事务将会被回滚
但是,上述实现需要确保`事务在engine中提交前binlog必须先被持久化`。故而,在上图中在调用`write`写入binlog后还需要确保调用`fsync`来令binlog内容被刷新到磁盘文件中。