首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.5 升級 5.6 遇 GTID 一致性報錯:非事務表與事務表混合更新受限

     編輯:MySQL 綜合教學

MySQL 5.5 升級 5.6 遇 GTID 一致性報錯:非事務表與事務表混合更新受限

升級 5.6 後啟用 GTID (enforce_gtid_consistency=ON),執行跨引擎更新報錯: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 模式下,為保證主從一致性,**禁止在同一事務/語句中同時更新事務表與非事務表**。典型場景:業務表用 InnoDB,日誌/統計表用 MyISAM,一條存儲過程或多表 UPDATE 觸發限制。

官方限制說明

Updates to tables using nontransactional storage engines such as MyISAM cannot be made in the same statement or transaction as updates to tables using transactional storage engines such as InnoDB.

解決方案

  1. 統一引擎:將 MyISAM 表轉為 InnoDB(ALTER TABLE tbl ENGINE=InnoDB;),徹底消除問題,同時獲得事務、行鎖、崩潰恢復優勢。
  2. 拆分事務:先更新 InnoDB 表提交,再更新 MyISAM 表(自動提交),兩階段提交應用層保證最終一致性。
  3. 關閉 enforce_gtid_consistency:SET GLOBAL enforce_gtid_consistency=OFF;(不推薦,失去 GTID 一致性保證,主從易漂移)。
  4. 改用單語句自動提交:將混合更新拆為多條獨立語句,各自隱式提交(需業務可接受中間狀態)。

遷移檢查清單

  • SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='db' AND ENGINE='MyISAM'; 掃描非事務表。
  • 檢查存儲過程、觸發器、應用代碼中是否有跨引擎寫入。
  • 測試環境先開啟 GTID 驗證,再推生產。

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved