錯誤現象
Warning: Some non-transactional changed tables couldn't be rolled back
執行 ROLLBACK 時出現,表示事務涉及的表不支援事務,回滾無效。
核心成因
- 誤以為表是事務型:實際為 MyISAM(非事務引擎)。
- 引擎不支援或被禁用:嘗試用 InnoDB 建表,但伺服器未編譯支援或啟動參數禁用(
--skip-innodb),MySQL 靜默降級為 MyISAM。
診斷步驟
| 檢查項目 | 指令 |
| 表引擎類型 | SHOW TABLE STATUS LIKE 'tbl_name'; 或 SHOW CREATE TABLE tbl_name; |
| 伺服器支援引擎 | SHOW ENGINES; |
| 特定引擎可用性 | SHOW VARIABLES LIKE 'have_%';(如 have_innodb) |
解決方案
- 確認業務是否真正需要事務(ACID),若不需可接受警告。
- 需事務時:修正建表語句明確指定
ENGINE=InnoDB,並確保伺服器啟用 InnoDB。
- 避免同一事務混用事務型與非事務型表(行為未定義)。
最佳實踐
生產環境建議預設建表引擎設為 InnoDB(default-storage-engine=InnoDB),僅在唯讀/查詢型場景明確指定 MyISAM/MEMORY 等非事務引擎。
- 上一篇文章: MySQL 靜態表(Fixed Format)特徵與效能優勢全解析
- 下一篇文章: MySQL 系統表升級完整指南:mysql_fix_privilege_tables 腳本實戰
Copyright ©
程式碼之家 All Rights Reserved