天天看點

MySQL 基礎 ———— SAVEPOINT 的應用引言一、SAVEPOINT 文法二、示範

引言

savepoint 關鍵字用于在資料庫事務中設定一個存儲點,在一個較長的事務中暫存資料,如果在事務末尾執行復原,可選擇性的復原到 savepoint 設定的暫存點。

本文承接上一篇部落格《MySQL 基礎 ————事務與隔離級别總結》,進一步探讨事務在實際生産中的重要場景——復原。

一、SAVEPOINT 文法

SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
           

資料庫的 InnoDB 存儲引擎(一般情況下都是指此引擎,該引擎是MySQL預設存儲引擎,因為另一個比較常見的存儲引擎MyISAM不支援事務)支援的 SAVEPOINT 語句,包括上述三種。

SAVEPOINT 通過自定義的名稱設定一個存儲點,如果目前事務已經有了一個同名的 SAVEPOINT ,那麼舊的将會被替代。

ROLLBACK TO SAVEPOINT 子句可以将目前事務回退到自定義的存儲點位置,而不會結束事務,InnoDB 不會釋放記憶體中的行鎖(對于新插入的行,鎖資訊是由存儲在行中的事務ID攜帶,而不會單獨存儲在記憶體中,那麼對于這類鎖,是會被釋放的),存儲點之後語句都會撤銷執行,包括新設定的存儲點,也同樣會被删除。

RELEASE SAVEPOINT 子句,會從目前的事務 SAVEPOINT 集合中,移除指定名稱的 SAVEPOINT 。

另外,執行 COMMIT 或 ROLLBACK (未指定 SAVEPOINT)都會清空目前事務的所有 SAVEPOINT。

二、示範

員工表:

MySQL 基礎 ———— SAVEPOINT 的應用引言一、SAVEPOINT 文法二、示範

操作過程是,開啟事務,然後執行兩條更新語句,第一條更新 6 号員工的工資,然後設定一個 SAVEPOINT ,第二條更新 9 号員工的工資,執行完成後,復原到 SAVEPOINT ,然後 COMMIT ,檢視6 号 和 9 号員工的工資各有什麼變化。

1、開啟事務:

SET autocommit = 0;
           

2、執行更新 6 号員工工資的語句: 

UPDATE emp SET salary = 4000 WHERE emp_id = 6;
           
MySQL 基礎 ———— SAVEPOINT 的應用引言一、SAVEPOINT 文法二、示範

3、執行 SAVEPOINT:

SAVEPOINT id_6_updated;
           

4、再執行第二條語句,更新 9 号員工的工資:

UPDATE emp SET salary = 6000 WHERE emp_id = 9;
           
MySQL 基礎 ———— SAVEPOINT 的應用引言一、SAVEPOINT 文法二、示範

5、然後,復原到 SAVEPOINT id_6_updated:

ROLLBACK TO SAVEPOINT id_6_updated;
           

6、送出更新:

COMMIT;
           

7、檢視最後的更新結果:

MySQL 基礎 ———— SAVEPOINT 的應用引言一、SAVEPOINT 文法二、示範

可以看到, 6 号員工的工資成功被修改,而 9 号員工的工資雖然執行了更新,但是因為復原到了執行語句之前的 SAVEPOINT 而沒有被更新。

繼續閱讀