首頁 > 軟體

MySQL事務(transaction)看這篇就足夠了

2022-11-03 14:02:46

MySQL事務處理(TransAction)

思考了很久,決定寫一篇關於mysql事務(transaction)的部落格,一來嘛,因為最近在複習mysql的相關知識,幫自己回顧總結一下,其次就是想把這篇部落格分享給大家,如果你才剛剛開始學習mysql,那麼希望這篇部落格對你有一點啟發;亦或者你早已是一個mysql老油條,這篇部落格也會使你對mysql事務有一個更深的印象。

首先,什麼是事務呢?

事務就是由單獨單元的一個或多個sql語句組成,在這個單元中,每個sql語句都是相互依賴的。而整個單獨單元是作為一個不可分割的整體存在,類似於物理當中的原子(一種不可分割的最小單位)。

往通俗的講就是,事務就是一個整體,裡面的內容要麼都執行成功,要麼都不成功。不可能存在部分執行成功而部分執行不成功的情況。

就是說如果單元中某條sql語句一旦執行失敗或者產生錯誤,那麼整個單元將會回滾(返回最初狀態)。所有受到影響的資料將返回到事務開始之前的狀態,但是如果單元中的所有sql語句都執行成功的話,那麼該事務也就被順利執行。

大家都知道,我們的資料都是通過各種不同技術的儲存引擎來引導儲存的,不同的儲存引擎,都有各自的特點。在mysql中,常見的儲存引擎有innodb、myisam,memory等。其中innodb支援事務(transaction),而myisam,memory等不支援事務。

可以通過show engines;語句來檢視mysql支援的儲存引擎

一、事務的四個特性(ACID)【面試常考項】

  • 原子性(Atomicity):指事務是一個不可分割的最小工作單位,事務中的操作只有都發生和都不發生兩種情況
  • 一致性(Consistency):事務必須使資料庫從一個一致狀態變換到另外一個一致狀態,舉一個栗子,李二給王五轉賬50元,其事務就是讓李二賬戶上減去50元,王五賬戶上加上50元;一致性是指其他事務看到的情況是要麼李二還沒有給王五轉賬的狀態,要麼王五已經成功接收到李二的50元轉賬。而對於李二少了50元,王五還沒加上50元這個中間狀態是不可見的。
  • 隔離性(Isolation):一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對並行的其他事務是隔離的,並行執行的各個事務之間不能互相干擾。
  • 永續性(Durability):一個事務一旦提交成功,它對資料庫中資料的改變將是永久性的,接下來的其他操作或故障不應對其有任何影響。

二、事務的分類

事務分為隱式事務和顯式事務兩種。我們的DML語句(insert、update、delete)就是隱式事務。

1.隱式事務:該事務沒有明顯的開啟和結束標記,它們都具有自動提交事務的功能;不妨思考一下,update語句修改資料時,是不是對錶中資料進行改變了,它的本質其實就相當於一個事務。

舉一個栗子:張三同學買了一個csdn客製化保溫杯花了99元,是不是就是update語句對欄位name為張三的同學的餘額balance進行減99元的處理呢?程式碼如下:

2.顯示事務:該事務具有明顯的開啟和結束標記;也是本文重點要講的東西。使用顯式事務的前提是你得先把自動提交事務的功能給禁用。禁用自動提交功能就是設定autocommit變數值為0(0:禁用 1:開啟)

先檢視一下當前的autocommit變數值,發現當前處於開啟自動提交事務的狀態

禁用自動提交事務的功能並檢視當前狀態

三、開啟事務的步驟

假設t_account表已經存在

#步驟一:開啟事務(可選)
start transaction;
#步驟二:編寫事務中的sql語句(insert、update、delete)
#這裡實現一下"李二給王五轉賬"的事務過程
update t_account set balance = 50 where vname = "李二";
update t_account set balance = 130 where vname = "王五";
#步驟三:結束事務
commit; #提交事務
# rollback; #回滾事務:就是事務不執行,回滾到事務執行前的狀態

執行結果:

四、事務並行時出現的問題

但是呢,因為某一刻不可能總只有一個事務在執行,可能出現A在操作t_account表中的資料,B也同樣在操作t_account表,那麼就會出現並行問題,對於同時執行的多個事務,當這些事務存取資料庫中相同的資料時,如果沒有采用必要的隔離機制,就會發生以下各種並行問題。


IT145.com E-mail:sddin#qq.com