MySql binlog 是否可以有多个open transaction?
Can MySql binlog have more than one open transaction?
能否MySqlbinlog同时有多个打开的事务(=不同事务的事件在binlog中交错)?
有 XID event 包含交易 ID,但没有表示交易开始的事件 并且 包含交易 ID。我将“和”设为粗体,因为其中有查询“BEGIN”的 QUERY 事件,但它没有说明它属于哪个事务。
或者 mysql 是否在 binlog 中序列化事务,即使其中有几个事务在数据库中处于活动状态?
查看 debezium 来源 here 似乎答案是否定的,但我希望在 mysql 或官方文档的来源中看到确认。
首先我们必须声明“交易”是特定引擎的功能。 InnoDB 是人们使用的主要引擎,所以我将重点介绍它。
是的,当然可以有多个事务,因为如果没有,就永远不会出现死锁。
但是 binlog doesn't include anything that wasn't committed:
Binary logging is done immediately after a statement or transaction completes but before any locks are released or any commit is done. This ensures that the log is logged in commit order.
因此,事务日志本质上是序列化的。
MariaDB has some InnoDB documentation 包括:
You can modify data on a maximum of 96 * 1023 concurrent transactions
that generate undo records. Of the 128 rollback segments, InnoDB
assigns 32 to non-redo logs for transactions that modify temporary
tables and related objects, reducing the maximum number of concurrent
data-modifying transactions to 96,000, from 128.000. The limit is
32,000 concurrent transactions when all data-modifying transactions
also modify temporary tables.
日志的目的是通过重播已完成的语句和事务,能够从灾难性损失中恢复。如果恢复通过事务日志进行并且事务从未提交,则该事务不在事务日志中。
对于常规事务,二进制日志不能包含任何未提交的事务。数据更改在提交之前不会写入二进制日志。
但 XA 事务不同。 XID 事件是 XA 事务的一部分。二进制日志中可能有多个“准备好的”XA 事务。
https://dev.mysql.com/doc/refman/5.7/en/xa-restrictions.html 说:
Note that the initial part of the transaction, identified by XA_prepare_log_event, is not necessarily followed by its XA COMMIT or XA ROLLBACK, which can cause interleaved binary logging of any two XA transactions.
这并没有明确说明二进制日志可以包含多个打开的 XA 事务,但它是隐含的。如果一次只能有一个活动的,那么 XA 事务交错就没有意义了。
请注意,这适用于 MySQL 5.7.7 及更高版本。 MySQL 的早期版本根本不支持二进制日志记录 XA 事务。
如果你想阅读源代码,它在 sql/xa.cc。
能否MySqlbinlog同时有多个打开的事务(=不同事务的事件在binlog中交错)?
有 XID event 包含交易 ID,但没有表示交易开始的事件 并且 包含交易 ID。我将“和”设为粗体,因为其中有查询“BEGIN”的 QUERY 事件,但它没有说明它属于哪个事务。
或者 mysql 是否在 binlog 中序列化事务,即使其中有几个事务在数据库中处于活动状态?
查看 debezium 来源 here 似乎答案是否定的,但我希望在 mysql 或官方文档的来源中看到确认。
首先我们必须声明“交易”是特定引擎的功能。 InnoDB 是人们使用的主要引擎,所以我将重点介绍它。
是的,当然可以有多个事务,因为如果没有,就永远不会出现死锁。
但是 binlog doesn't include anything that wasn't committed:
Binary logging is done immediately after a statement or transaction completes but before any locks are released or any commit is done. This ensures that the log is logged in commit order.
因此,事务日志本质上是序列化的。
MariaDB has some InnoDB documentation 包括:
You can modify data on a maximum of 96 * 1023 concurrent transactions that generate undo records. Of the 128 rollback segments, InnoDB assigns 32 to non-redo logs for transactions that modify temporary tables and related objects, reducing the maximum number of concurrent data-modifying transactions to 96,000, from 128.000. The limit is 32,000 concurrent transactions when all data-modifying transactions also modify temporary tables.
日志的目的是通过重播已完成的语句和事务,能够从灾难性损失中恢复。如果恢复通过事务日志进行并且事务从未提交,则该事务不在事务日志中。
对于常规事务,二进制日志不能包含任何未提交的事务。数据更改在提交之前不会写入二进制日志。
但 XA 事务不同。 XID 事件是 XA 事务的一部分。二进制日志中可能有多个“准备好的”XA 事务。
https://dev.mysql.com/doc/refman/5.7/en/xa-restrictions.html 说:
Note that the initial part of the transaction, identified by XA_prepare_log_event, is not necessarily followed by its XA COMMIT or XA ROLLBACK, which can cause interleaved binary logging of any two XA transactions.
这并没有明确说明二进制日志可以包含多个打开的 XA 事务,但它是隐含的。如果一次只能有一个活动的,那么 XA 事务交错就没有意义了。
请注意,这适用于 MySQL 5.7.7 及更高版本。 MySQL 的早期版本根本不支持二进制日志记录 XA 事务。
如果你想阅读源代码,它在 sql/xa.cc。