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

MySQL 事務陷阱與藝術:不可回滾的 DDL、Savepoint 部分回滾與隱式提交陷阱

     編輯:MySQL 綜合教學

不能回滾的語句 (隱式提交)

執行以下 DDL/DCL 語句會強制提交當前事務,並自動在獨立事務中執行,無法 ROLLBACK:

CREATE/ALTER/DROP DATABASE
CREATE/ALTER/DROP TABLE
RENAME TABLE
TRUNCATE TABLE
CREATE/DROP INDEX
CREATE/DROP EVENT
CREATE/DROP FUNCTION
CREATE/DROP PROCEDURE

血淚案例

START TRANSACTION;
DROP TABLE MyImportantData;  -- 當前事務被強制 COMMIT,表永久刪除
ROLLBACK;  -- 無效,數據已不屬於你

特例:臨時表

CREATE/ALTER/DROP TEMPORARY TABLE 不觸發隱式提交,但同樣不可回滾。

Savepoint:事務中的「時光機」

在事務中設置命名保存點,可部分回滾到某個保存點,不影響之前的更新。

語法

SAVEPOINT savepoint_name;           -- 創建
ROLLBACK TO savepoint_name;         -- 回滾到此處
RELEASE SAVEPOINT savepoint_name;   -- 釋放 (可選)

實戰示例

START TRANSACTION;
INSERT INTO tableA VALUES (1,2,3);
SAVEPOINT tableA_updated;   -- 記錄點
INSERT INTO tableB VALUES (4,5,6);
-- 發現 tableB 邏輯有誤,只想撤銷 tableB
ROLLBACK TO tableA_updated;  -- tableB 回滾,tableA 保留
COMMIT;  -- 只提交 tableA
  • 可設置多個 Savepoint,任意回滾。
  • 事務 COMMIT 或整體 ROLLBACK 時,所有 Savepoint 自動釋放。

總結

  • DDL 在事務中極度危險,嚴禁混用。
  • Savepoint 讓長事務擁有細粒度錯誤恢復能力,配合 InnoDB 行鎖/MVCC,構建健壯應用。
  • MyISAM 不支持事務/行鎖/MVCC,無理由堅持使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved