MySQL事務學習筆記(一) 初遇篇

北冥有隻魚發表於2022-02-26

如何開啟事務

在《資料庫事務概論》中我們已經討論了事務的基本概念、性質,那麼在MySQL中如何將一系列操作當做一個事務呢。像下面這樣:

BEGIN;  //代表開啟事務

UPDATE  Student SET name = '張三三' WHERE id = '1';

COMMIT; // 代表將BEGIN和COMMIT之間的語句進行提交,也就是請求MySQL將結果重新整理到磁碟上

如果只有BEGIN,沒有COMMIT,那麼代表BEGIN下面對資料的操作還未刷到磁碟上, 代表該事務處於部分提交的狀態,在事務隔離級別為不可重讀的情況下,其他Session 無法讀到了這個更新,通過:

 SHOW VARIABLES LIKE 'transaction_isolation';

可以檢視MySQL中事務預設的隔離級別:

MySQL事務的預設隔離級別

可以看到當前我的資料庫的隔離級別是可重複讀,在這種情況下其他Session 是無法讀到這個處於未提交狀態的事務的更新的,我們來驗證一下:

開啟事務還未提交

現在我們再開啟一個Session,也就是再開一個命令列介面,看能不能查詢到上圖對應Session的更新。

不可重複讀示例

可以看到name還是張三三,現在我們執行Commit指令,提交事務,等價於請求MySQL將事務所做的改變重新整理到磁碟上。然後看下另一個Session是否能查詢到。

提交事務

查詢到了更新

自動提交

可能有同學會問,我平時直接執行單條UPDATE語句,在別的Session 中直接能查詢到,那是不是不加UPDATE語句就不算事務了啊,那要不然為啥我執行了UPDATE,其他Session 立刻能查詢到呢? 像下面這樣:

隱式提交-1

隱式提交-2

如果我們不顯式的使用BEGIN或START TRANSACTION(比BEGIN更全面)來開啟一個事務,那麼每個DML語句(INSERT,UPDATE,DELETE )都算是一個獨立的事務,自動提交,這種特性我們稱之為事務的自動提交,在MySQL中可以通過:

SHOW VARIABLES LIKE 'autocommit';

檢視該特性是否開啟:

自動提交

隱式提交

如果我們不想用自動提交可以用 BGEIN 和 COMMIT語句來手動提交,或者將autocommit關閉,但是即使我們使用了BGEIN,也不能百分之百的保證MySQL不會自動提交,在以下情況下:

  • 如果BEGIN後跟了DDL語句(定義或修改資料庫物件的資料定義語言 ,Data definition language )
  • 隱式使用或修改mysql(這個是MySQL自帶的資料庫,就叫mysql)資料庫中的表
  • 事務控制或關於鎖定的語句(BEGIN後面又來了個 BEGIN或者 START TRANSACTION)
  • 或者在當前Session中開啟autocommit的開關
  • 或者使用LOCK TABLE、UNLOCK TABLES等關於鎖定的語句也會隱式的提交前邊語句所屬的事務
  • 載入資料的語句, 比如我們使用LOAD DATA語句來批量往資料庫中帶入資料時,也會隱式的提交前面語句所屬的事務
  • MySQL複製的一些語句,使用START SLAVE,STOP SLAVE 、RESET SLAVE等語句時也會觸發隱式提交
  • ANALYZE TABLE [表名]、CACHE INDEX、CHECK TABLE [表名] 等語句也會觸發前邊語句所屬的事務。

手動中止事務

那如果發生了意外,我想回滾或者手動中止事務呢,我們可以藉助RollBack指令,像下面這樣:

ROLLBACK指令執行

這裡需要強調的是,ROLLBACK語句是MySQL用來需要手動的回滾事務時提供的語句,如果MySQL的事務在執行過程中遇到了某些錯誤而無法繼續執行的時候,事務會自動的進行回滾。

儲存點

如果我們在Begin之後,執行了好多條UPDATE 語句呢,我們只想回滾到某個點,再接著執行呢,請儲存點同志出場說話,在事務對應的語句上當上幾個點,呼叫ROLLBACK語句的時候,我們就能回滾到我們想回滾的點了。示例如下:

儲存點回滾演示

語法示例:

SAVEPOINT 儲存點名稱  // 產生儲存點
RELEASE SAVEPOINT 儲存點名稱 // 刪除儲存點

另一種開啟事務的方式

上面我們都是採取BEGIN語句來開啟事務的,MySQL中還有另一種開啟事務的語法:

START TRANSACTION [修飾符],[修飾符],[修飾符];

START TRANSACTION相對於BEGIN語句的不同之處就在於,START TRANCATION可以跟修飾符, 如下所示:

  • READ ONLY (只讀模式)
在該模式下只允許讀資料,不允許寫永久表的資料,可以寫臨時表的資料,臨時表只存在於當前會話。

示例:

只讀模式

  • WRITE ONLY 只寫模式
  • WITH CONSISTENT SNAPSHOT 一致性讀。

一個事務的模式是不能即使只讀模式,又是隻寫模式,我們不加修改預設就是既允許讀又允許讀。

相關文章