binlog是如何记录mysql对事务表和非事务表的DML操作


本文主要给大家简单讲讲binlog是如何记录mysql对事务表和非事务表的DML操作,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望binlog是如何记录mysql对事务表和非事务表的DML操作这篇文章可以给大家带来一些实际帮助。 实验环境:mysql官方社区版5.7.18, 操作系统centos7.3,binlog日志格式采用row格式。1、创建Myisam表b和Innodb表a。
CREATE TABLE `a` ( `id` int(11) NOT NULL, `name` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `b` ( `id` int(11) DEFAULT NULL, `name` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;可以看出,两个表结构都是一样的,除了引擎不同。
2、根据GTID是否开启,分为2大类:
(1.1)关闭GTID,显式开启事务并提交事务。从生成的binlog来看,不管是Myisam还是Innodb引擎,都生成相应的binlog日志。(1.2)关闭GTID,显式开启事务并回滚事务从生成的binlog可知,表a回滚了数据,而表b由于是非事务表的缘故,没有回滚数据。同时表开发云主机域名b的数据变更也生成对应的binlog日志。而表a由于事务回滚的缘故,没有变更数据,也没有生成binlog。
(2.1)开启GTID,显式开启事务并提交事务。从报错信息可知,在开启GTID模式下,非事务表的DML操作只能在autocommitted statements和single-statement transactions情况下执行,在一个显式事务中混合事务表和非事务表的DML操作是不被允许的。从生成的binlog可知,只生成了表a的DML变更记录。(2.2)开启GTID,显式开启事务并回滚事务。从报错信息可知,在开启GTID模式下,非事务表的DML操作只能在autocommitted statements和single-statement transactions情况下执行,在一个显式事务中混合事务表和非事务表的DML操作是不被允许的。表a和表b都没有数据变更。从生成的binlog可知,也没有生成对应的变更记录。综上所述,在mysql未开启GTID模式下,显式执行的事务中如果包含了非事务表的DML,这些表的数据并不会回滚(非事务性表无回滚的概念),同时也会为了主从数据一致的缘故,生成对应的binlog日志。而开启GTID模式下,非事务表只能在autocommit=1模式下单独执行或者只包含单个SQL的事务里执行。可见,开启GTID模式,通过禁止非事务表混入显式事务的方式去更好的保证了事务ACID特性,这种方式更为安全。binlog是如何记录mysql对事务表和非事务表的DML操作就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

相关推荐: 解析MYSQL BINLOG 二进制格式(1)–准备工作

点击(此处)折叠或打开开发云主机域名

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/09 11:14
下一篇 06/09 11:14

相关推荐