From b649c1ec0c4f34f87cec8af9674b38ad86c83a23 Mon Sep 17 00:00:00 2001 From: asahi Date: Tue, 26 Aug 2025 12:44:30 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBmysql=202pc=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_事务.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index 24c6337..47ea59b 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -592,3 +592,29 @@ group commit通常用于提高事务处理系统的性能。group commit将多 ##### 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)。 + + + +如上图所示,使用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内容被刷新到磁盘文件中。 +