#### 17.5.1.35复制和事务

[](<>)[](<>)

**在同一事务中混合事务性语句和非事务性语句。**通常，您应该避免在复制环境中同时更新事务表和非事务表的事务。您还应该避免使用访问事务（或临时）表和非事务表并写入其中任何一个表的任何语句。

服务器使用以下规则进行二进制日志记录：

-   如果事务中的初始语句是非事务性的，它们会立即写入二进制日志。事务中的其余语句被缓存，在提交事务之前不会写入二进制日志。（如果事务被回滚，缓存的语句只有在进行了无法回滚的非事务性更改时才会写入二进制日志。否则，它们将被丢弃。）

-   对于基于语句的日志记录，非事务语句的日志记录受[`binlog_直接_非事务性_更新`](replication-options-binary-log.html#sysvar_binlog_direct_non_transactional_updates)系统变量。当这个变量`关`（默认设置），日志记录如前所述。当这个变量`在…上`，对于事务中任何地方发生的非事务性语句（不仅仅是初始非事务性语句），都会立即进行日志记录。其他语句保存在事务缓存中，并在事务提交时记录。[`binlog_直接_非事务性_更新`](replication-options-binary-log.html#sysvar_binlog_direct_non_transactional_updates)对行格式或混合格式二进制日志记录无效。

[](<>)**事务性、非事务性和混合语句。** [](<>)为了应用这些规则，如果一条语句只更改非事务表，服务器会将其视为非事务语句；如果一条语句只更改事务表，服务器会将其视为事务语句。引用非事务表和事务表及更新的语句*任何*所有涉及的表格都被认为是“混合”陈述。与事务语句一样，混合语句在事务提交时被缓存和记录。

如果更新事务表的混合语句还执行以下任一操作，则该语句被视为不安全：

-   更新或读取临时表

-   读取非事务表，且事务隔离级别低于可重复级别\_阅读

    在事务中更新事务表之后的混合语句如果执行以下操作之一，则被视为不安全：

-   更新任何表并读取任何临时表

-   更新非事务表并[`binlog_直接_非事务性_更新`](replication-options-binary-log.html#sysvar_binlog_direct_non_transactional_updates)他走了

    有关更多信息，请参阅[第17.2.1.3节，“二进制记录中安全和不安全语句的确定”](replication-rbr-safe-unsafe.html).

笔记

混合语句与混合二进制日志格式无关。

在事务混合了对事务表和非事务表的更新的情况下，二进制日志中语句的顺序是正确的，即使是在[`回降`](commit.html)。但是，当第二个连接在第一个连接事务完成之前更新非事务表时，语句可能会被注销，因为第二个连接更新是在执行后立即写入的，而不管第一个连接正在执行的事务的状态如何。

**在源和副本上使用不同的存储引擎。**可以使用副本上的非事务表在源上复制事务表。例如，您可以复制`InnoDB`源表作为`米萨姆`复制表。但是，如果您这样做，如果在A的中间停止复制，则会出现问题。[`开始`](commit.html) ... [`犯罪`](commit.html)阻止，因为复制副本会在复制开始时重新启动[`开始`](commit.html)块

从中复制事务也是安全的[`米萨姆`](myisam-storage-engine.html)源上的表转换为事务表，例如使用[`InnoDB`](innodb-storage-engine.html)存储引擎，在副本上。在这种情况下[`自动提交=1`](server-system-variables.html#sysvar_autocommit)在源上发布的声明被复制，从而强制执行`自动提交`复制品上的模式。

当副本的存储引擎类型为非事务时，应避免源上混合事务表和非事务表更新的事务，因为它们可能会导致源事务表和副本非事务表之间的数据不一致。也就是说，此类事务可能会导致源存储引擎特定的行为，并可能导致复制失去同步。MySQL不会对此发出警告，因此在将事务表从源复制到副本上的非事务表时，应该格外小心。

**在事务中更改二进制日志记录格式。**那个[`binlog_格式`](replication-options-binary-log.html#sysvar_binlog_format)和[`binlog_校验和`](replication-options-binary-log.html#sysvar_binlog_checksum)只要事务正在进行，系统变量都是只读的。

每笔交易（包括[`自动提交`](server-system-variables.html#sysvar_autocommit)事务）记录在二进制日志中，就像它以[`开始`](commit.html)语句，并以[`犯罪`](commit.html)或者[`回降`](commit.html)陈述对于影响使用非事务存储引擎（例如[`米萨姆`](myisam-storage-engine.html)).

笔记

有关专门适用于XA事务的限制，请参阅[第13.3.8.3节，“XA交易限制”](xa-restrictions.html).
