4.1.35复制和事务

在同一事务中混合事务性和非事务性语句。一般来说,应该避免在复制环境中同时更新事务性表和非事务性表的事务。还应该避免使用同时访问事务性(或临时)表和非事务性表并向其中任何一个表写入的语句。

服务器使用这些规则进行二进制日志记录:

  • 如果事务中的初始语句是非事务性的,则立即将它们写入二进制日志。事务中的其余语句将被缓存,直到事务提交时才写入二进制日志。(如果事务被回滚,缓存的语句只有在做出不能回滚的非事务性更改时才会被写入二进制日志。否则,它们将被丢弃。)

  • 对于基于语句的日志记录,非事务性语句的日志记录受到binlog_direct_non_transactional_updates系统变量。当这个变量是(默认值),日志记录就像刚才描述的那样。当这个变量是,对于事务中任何地方出现的非事务性语句(不仅仅是初始的非事务性语句),日志记录立即发生。其他语句保存在事务缓存中,并在事务提交时记录。binlog_direct_non_transactional_updates对行格式或混合格式二进制日志记录没有影响。

事务性、非事务性和混合语句。为了应用这些规则,如果一条语句只改变非事务性表,服务器就认为它是非事务性的;如果一条语句只改变事务性表,服务器就认为它是非事务性的。引用非事务性表和事务性表及更新的语句任何所涉及的表的一个混合声明。混合语句(如事务语句)在事务提交时被缓存和记录。

更新事务表的混合语句如果还执行以下操作之一,则被认为是不安全的:

  • 更新或读取临时表

  • 读取非事务性表,且事务隔离级别小于REPEATABLE_READ

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

有关更多信息,请参见第5.1.3节“二进制日志记录中安全与不安全语句的确定”

请注意

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

在事务对事务性表和非事务性表进行混合更新的情况下,二进制日志中的语句顺序是正确的,并且所有需要的语句都被写入二进制日志,即使是在发生回滚.但是,当第二个连接在第一个连接事务完成之前更新非事务性表时,语句可能会被乱序记录,因为第二个连接更新是在执行之后立即写入的,而与第一个连接执行的事务的状态无关。

在源和副本上使用不同的存储引擎。可以使用副本上的非事务性表复制源上的事务性表。例如,您可以复制InnoDB源表作为MyISAM复制表。但是,如果您这样做,如果副本在执行过程中停止,则会出现问题开始...提交块的开始处重新启动副本开始块。

从它复制事务也是安全的MyISAM源上的表转换为事务性表,例如使用InnoDB存储引擎,在副本上。在这种情况下,一个自动提交= 1在源上发布的语句被复制,因此是强制的自动提交副本上的模式。

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

更改事务中的二进制日志记录格式。binlog_format而且binlog_checksum只要事务正在进行,系统变量就是只读的。

每笔交易(包括自动提交Transactions)记录在二进制日志中,就好像它以开始语句,以a结尾提交或者一个回滚声明。对于影响使用非事务性存储引擎的表的语句(例如MyISAM).

请注意

有关专门应用于XA事务的限制,请参见XA交易限制