技术分享 | MySQL 同一事务中更新 innodb 和 myisam 表时应怎么办?

mysql 使用GTID主从复制后出现错误代码1785解决方法 意思是在启用了GTID的复制模式后,在同一事务中更新事务表与非事务表将导致多个GTIDs分配给同一事务。所以无法完成create,update等操作,以下是官方文档的解释。将错误表error_table存储引擎改为innodb。修改后需要重启msyql服务。 阅读详情

作者:刘开洋

爱可生交付服务团队北京 DBA,对数据库及周边技术有浓厚的学习兴趣,喜欢看书,追求技术。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

问题

同事在客户那里解决问题时发现一个报错,出于兴趣就进行了研究:

Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions,and never in the same statement as updates to transactional tables.

报错的意思是指业务端下发的事务违反了 GTID 的一致性。

原因是,非事务表和事务表在一条事务里进行了更新,MySQL 是不允许我们这么做的,但业务非要胳膊掰大腿,怎么办?

官方说明:

Only statements that can be logged using GTID safe statements can be logged when enforce_gtid_consistency is set to ON,so the operations listed here cannot be used with this option:

  • Transactions or statements that update both transactional and nontransactional tables.

跟客户沟通确定了该报错事务涉及到的两张表分别是 innodb 表和 myisam 表。我们在自己环境上复现一下。

复现

使用 mysql 5.7.25,开启 gtid,

并分别创建一张 innodb 表和 myisam 表。

在同一个事务中对两张表进行更新:

没有报错呀,怎么和客户那里的报错解释不符?

我们将两张表的提交顺序换一下呢?

果然复现了客户环境中的报错。可是为什么先更新 myisam 引擎表可以更新 innodb 引擎表,但是反之则不行呢?

因为 myisam 引擎表不支持事务,在我们下发 begin 之后,就已经隐式提交了,这是个运维经验,无法直接判断,专门请教了行业大牛得到了确认;

而继续更新 myisam 表时,MySQL 不认这个 insert myisam 表的操作是一个事务操作,只是给予一个记录 binlog 位置的 gtid,之后再更新 innodb 表的操作时,mysql 就认定这是在更新一条事务,在 commit 中就将这条事务提交了。

解决

解决办法有三种:

  1. 在业务层面修改事务逻辑,将对 myisam 表和 innodb 表的更新语句拆分到不同事务中。

  2. 将 myisam 存储引擎改为 innodb 存储引擎。

  3. 关闭事务一致性参数 ENFORCE_GTID_CONSISTENCY。

接下来分别对三种解决方案进行验证:

1)修改业务逻辑,将 myisam 表的更新语句单独放在一个事务里执行。

这是最为稳妥的一个方法。

2)修改 myisam 表的存储引擎为 innodb

  1. 首先确认如果数据量比较大,可以使用 mysqldump 导出数据,然后修改 SQL 文件中的存储引擎的类型和表名,删掉 drop table 的操作,之后保存 SQL 文件导入到数据库中。

  2. percona 公司也有一款工具适用于这样的场景,有兴趣的同学可以研究使用下,以备生产环境的使用:pt-online-schema-change。

  3. 如果表数据量很小,就可以使用常规的 alter 语句直接修改:alert table sanguo engine = InnoDB。

注意:

myisam 存储引擎表不支持事务,innodb 表相对于 myisam 表来说能支持更多的数据库高级操作,例如:事务、外键。随着 MySQL 版本的不断更新迭代,innodb 的优势越来越大,建议将所有 MySQL 表的存储引擎逐渐替换为 innodb,两种存储引擎其他方面的优劣对比参考网上文档。

3)关闭事务一致性参数 ENFORCE_GTID_CONSISTENCY

OFF_PERMISSIVE: New transactions are anonymous. Replicated transactions can be either anonymous or GTID transactions.

  • 匿名事务依赖于二进制日志文件和位置来识别特定的事务。

  • 从 MySQL 5.7.6 开始,添加的 OFF_PERMISSIVE 和 ON_PERMISSIVE 模式允许在拓扑中混合使用这些事务类型。

对表的更新操作完成。

我们去看看此时 binlog 中的写入:

关闭 ENFORCE_GTID_CONSISTENCY 参数后新事务的提交都是匿名的,且提交顺序被打乱,数据库不再进行一致性检查;但此时复制会中断,数据库使用的 HA 将失效。权衡利弊,对于业务来说代价较高,不建议使用。

附:

如果在一个生产环境中,不建议同时更新 innodb 和 myisam 存储引擎表,对于 myisam 引擎表的更改是无法进行回滚的,建议业务将 SQL 上线前一定做好检查。

参考

https://dev.mysql.com/doc/refman/5.7/en/replication-options-gtids.html

https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

php面试题之innoDB和myisam的区别 这篇文章介绍的内容是关于php面试题八之innoDB和myisam的区别,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 八重樱:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新)​zhuanlan.zhihu.com InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE... 阅读详情

相关推荐

rk3568 android 11.0 userdata 改为ext4格式

功能:解决设备在恢复出厂设置进行擦除数据的时候卡住问题。 1.修改userdata分区为ext4格式 diff --git a/device/rockchip/common/scripts/fstab_tools/fstab.in b/device/rockchip/common/scripts/fstab_tools/fstab.in index 583e75579d..036336835d 100755 --- a/device/rockchip/common/scripts/fstab_tools/

chgh1306的专栏 2576

Statement violates GTID consistency: Updates to non-transactional tables can only be done in either

分析原因:关键点语句【对非事务性表的更新】,翻看代码中加了事务注解 @Transactional,测试环境表的数据库引擎是InnoDB,是支持事务的,经执行代码也没问题,线上报此错误,猜想线上表的数据库引擎可能是不支持事务的,有可能是公司DB在建线上表的时候建错了。将数据库表引擎改为 InnoDB ,再执行代码,不报错了。翻译后:语句违反GTID一致性:对非事务性表的更新只能在自动提交语句或单语句事务中进行,并且永远不能在对事务性表的更新的同一语句中进行。

better1120的博客 2126

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT.

1、情况描述 在执行sql:create table 表A as select * from 表B时,发现sql执行后,并未生成新的表,而是提示Statement violates GTID consistency: CREATE TABLE ... SELECT. 2、问题分析 MySQL5.6及以上的版本,开启了 enforce_gtid_consistency=true 功能导致的,...

码地 5万+

876-基于STM32的毫米波雷达智能睡眠监测系统

基于STM32的毫米波雷达智能睡眠监测系统通过非接触式毫米波雷达检测人体呼吸频率和体动次数,结合WIFI数据传输和OLED显示,实现睡眠质量分析与远程监控。系统核心功能包括生理参数采集、阈值设置、数据可视化及远程交互。

m0_50083169的博客 1545

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 356

Statement violates GTID consistency: Updates to non-transactional tables

Statement violates GTID consistency: Updates to non-transactional tables,can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables. 解决 在my.cnf 中将 gtid_mode = O.

罗罗的1024 2858

【30天从零玩转AI应用开发】第16篇:智能体Agent入门——ReAct框架原理+首个会思考、会动手的AI实战

摘要: 本文介绍了AI智能体(Agent)的核心概念及其与普通大模型(LLM)的区别。通过ReAct(Reason+Act)框架,智能体实现了自主思考、调用工具和分步执行的能力。文章详细讲解了LangChain Agent的四大组件,并推荐新手使用ZERO_SHOT_REACT_DESCRIPTION类型。最后提供了一个完整的智能体实战代码示例,该智能体具备数学计算和天气查询功能,能够自主选择工具完成任务,展示了AI从”被动回答“到”主动行动“的关键进化。

在上海谋生的软件喵记录喵生 626

数据库操作数据报错:Statement violates GTID consistency: Updates to non-transactional tables can only be ...

MySQL同一事务中更新 innodb 和 myisam 表报错:Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tabl

weixin_52116015的博客 1511

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1247

120、ISP 驱动架构解析:从 V4L2 请求到 ISP 硬件的配置下发流程

本文以实际案例解析ISP驱动架构的V4L2到硬件配置下发流程。作者通过一个因内存共享导致画面闪烁的bug案例,详细剖析了用户空间参数通过V4L2结构体传递、驱动层拆包与硬件寄存器映射、时序同步机制等关键环节。特别强调深拷贝、dirty flag增量更新、shadow register等实现要点,并给出多路并发隔离、寄存器写入失败等典型问题的排查方法。文章建议开发者深入理解参数到寄存器的转换过程,推荐通过debugfs实时监控寄存器状态,避免过度依赖自动调试工具。全文以实践为导向,对ISP驱动开发具有直接指导

sundong_81的博客 159

Mysql事务以及InnoDB和MyISAM区别讲解

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,博客昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步! 吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中… 文章目录一、数据库事务简介二、InnoDB 和 MyISAM三、MYSQL引擎简介 一、数据库事务简介 写这篇文章初衷是有一个大佬.

末尾卡片和博主交流学习! 4676

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

虾皮二面:MySQL支持哪些存储引擎?MyISAM和InnoDB的区别什么?

并且,你还可以根据 MySQL 定义的存储引擎实现标准接口来编写一个属于自己的存储引擎。一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择 MyISAM 也是一个不错的选择。大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。

z1ztai的博客 1609

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

mysql myisam 事务_Mysql事务以及InnoDB和MyISAM区别讲解

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,博客昵称是希望自己能不断精进,向着优秀程序员前行!博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…一、数据库事务简介写这篇文章初衷是...

weixin_39881167的博客 149

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql 事务 myisam_Mysql事务以及InnoDB和MyISAM区别讲解

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,博客昵称是希望自己能不断精进,向着优秀程序员前行!博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…一、数据库事务简介写这篇文章初衷是...

weixin_34446948的博客 293

MySQL-InnoDB和MyIsam的区别

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 1、InnoDB和MyIsam是什么? InnoDB和MyIsam是MySQL最常用的两种存储引擎。MySQL有多种存储引擎,每种存储引擎有各自的优缺点。可以使用命令"show engines"查看引擎。 2、如何使用InnoDB和MyIsam? MySQL 5.5版本以及以后默认使用InnoDB,如果创建表时候不指定存储引擎默认使用InnoDB。如果不想.

了解➔熟悉➔掌握➔精通 539

MySQL数据引擎InnoDB和MyISAM,12缸就是猛!

见到12缸的高尔夫,法拉利也要颤抖

Craig无忌 2983

MySQL存储引擎InnoDB vs. MyISAM,技术选型如何判断?

本文对比了MySQL中InnoDB和MyISAM两种存储引擎的核心差异。InnoDB因支持事务、外键、行锁和聚簇索引等特性成为默认选择,适合高并发场景;而MyISAM在读多写少、不需要事务的场景仍有优势。技术选型需根据具体需求权衡,理解各自特性才能做出合理决策。关注【程序视点】可获取MySQL高级教程资源。

angotech的博客 919

MySQL存储引擎深度对比:InnoDB vs MyISAM及其应用场景解析

提到存储引擎,你可以把它想象成MySQL的“文件管理员”。MySQL采用了一种插件式的架构,允许用户为不同的表选择不同的存储引擎来处理数据的存储和检索。换句话说,存储引擎决定了数据在磁盘上的组织方式、索引的实现逻辑,甚至是并发控制的策略。这种灵活性让MySQL能适应从简单日志存储到复杂金融交易的各种场景。MySQL支持多种存储引擎,比如InnoDB、MyISAM、Memory、CSV等,但其中最常用的无疑是InnoDB和MyISAM。

java_beautiful的博客 1019

MySQL存储引擎【InnoDB、MyISAM、Memory】

数据库,MySQL这样存在多存储引擎的数据库软件,清楚常见的存储引擎的区别,使用合适的存储引擎,使得项目跑的更顺畅,有时候对于一个项目,甚至比项目本身都重要。这篇文章,旨在浅谈常见的三种存储引擎的区别,优缺点。是学习也是分享。 1:查看MySQL所支持的存储引擎: 1.1 show engines; 1.2 show variables like 'have%'; 这样,我

字符集-utf8 1096

MySQL事务中更新多个表数据时,某些表不支持事务会发生什么???

我只在Mysql中做了测试,其它数据库各位读者如果有兴趣可以自己试试。1. 创建测试数据首先新建三张表:user、company、school。我们知道InnoDB引擎是支持事务的,而My...

lxw1844912514的博客 895

mysql跟my_mysql中innodb和myisam区别

前言InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了。1、事务和外键● InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能● MyISAM管理非事务表。它提供高速存储和检索...

weixin_42372837的博客 205
上一篇: 技术分享 | MySQL Shell import_table 数据导入
下一篇: 第36问:用 mysqlslap 压测的结果,为什么比用 sysbench 的结果平稳?
爱可生开源社区
博客等级 码龄8年 1937粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值