MySql binlog 可以同时有多个打开的事务(= 不同事务的事件在 binlog 中交错)?
存在包含事务 ID 的XID 事件,但没有表示事务开始并包含事务 ID 的事件。我把“和”加粗是因为其中有带有查询“BEGIN”的QUERY事件,但它没有说明它属于哪个事务。
或者mysql是否会在binlog中序列化事务,即使其中有几个在数据库中是活动的?
在这里查看debezium 来源,答案似乎是否定的,但我很想在 mysql 或官方文档的来源中看到确认。
首先,我们必须警告“事务”是特定引擎的功能。InnoDB 是人们使用的主要引擎,所以我将重点介绍它。
是的,当然可以有多个事务,因为如果没有,您将永远不会出现死锁。
二进制日志记录在语句或事务完成后但在任何锁被释放或任何提交完成之前立即完成。这可确保日志按提交顺序记录。
因此,事务日志本质上是序列化的。
MariaDB有一些 InnoDB 文档,其中包括:
您最多可以修改 96 * 1023 个生成撤消记录的并发事务的数据。在 128 个回滚段中,InnoDB 为修改临时表和相关对象的事务分配了 32 个非重做日志,将并发数据修改事务的最大数量从 128.000 减少到 96,000。当所有数据修改事务也修改临时表时,限制为 32,000 个并发事务。
日志的目的是能够通过重播已完成的语句和事务来从灾难性损失中恢复。如果恢复通过事务日志并且从未提交事务,则该事务不在事务日志中。
对于常规事务,二进制日志不能包含任何未提交的事务。数据更改在提交之前不会写入二进制日志。
但是 XA 交易是不同的。XID 事件是 XA 事务的一部分。二进制日志中可能有多个“准备好的”XA 事务。
https://dev.mysql.com/doc/refman/5.7/en/xa-restrictions.html说:
请注意,事务的初始部分(由 XA_prepare_log_event 标识)之后不一定是其 XA COMMIT 或 XA ROLLBACK,这可能导致任何两个 XA 事务的交错二进制日志记录。
这并没有明确说明二进制日志可以包含多个打开的 XA 事务,但它是隐含的。如果一次只能有一个活动,那么 XA 事务交错是没有意义的。
请注意,这适用于 MySQL 5.7.7 及更高版本。MySQL 的早期版本根本不支持二进制日志记录 XA 事务。
如果您想阅读源代码,它位于sql/xa.cc中。