1. 程式人生 > >MySQL基礎——事務以及隔離級別

MySQL基礎——事務以及隔離級別

一、事務

1、介紹:事務由單獨單元的一個或多個sql語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元格作為一個不可分割的整體,如果單元中某條sql語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的資料將返回到事務開始以前的狀態。如果單元中的所有sql語句均執行成功,則事務被順利執行。

2、事務的(ACID)屬性

(1)原子性(Atomicity)

原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

(2)一致性(Consistency)

事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。

(3)隔離性(Isolation)

事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能相互干擾。

3、事務的建立

(1)隱式事務:事務沒有明顯的開啟和結束的標記,比如INSERT、UPDATE、DELETE。(自動提交功能預設開啟)

(2)顯式事務:事務具有明顯的開啟和結束的標記,但前提是必須先設定自動提交功能為禁用。(只針對當前的事務有效,不會一直保持關閉狀態)

5、事務併發問題

併發問題的原因:對於同時執行的多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有采取必要的隔離機制,就會導致各種併發問題。

併發問題(1):髒讀

例如兩個事務T1,T2。T1讀取了已經被T2更新但還沒有被提交的欄位。之後,若T2回滾,T1讀取的內容就是臨時且無效的。

併發問題(2):不可重複讀

例如兩個事務T1,T2。T1讀取了一個欄位,然後T2更新了該欄位。之後,T1再次讀取同一個欄位,值就不同了。

併發問題(3):幻讀

例如兩個事務T1,T2。T1從一個表中讀取了一個欄位,然後T2在該表中插入了一些新的行。之後,如果T1再次讀取同一個表,就會多出幾行。
 

5、資料庫事務的隔離性

資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題。

6、一個事務與其他事務隔離的程度稱為隔離級別。資料庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,資料一致性就越好,但併發性越弱。

資料庫提供的4中事務隔離級別:

Oracle支援的2種事務隔離級別:READ COMMITED(預設是這個隔離級別,讀已提交資料) 和 SERIALIZABLE(序列化)。

Mysql支援以上4種事務隔離級別,其中預設隔離級別為:REPEATABLE  READ(可重複讀)。

9、DELETE和TRUNCATE在事務使用時的區別

DELETE刪除回滾後表還是存在的,然而TRUNCATE刪除表之後,哪怕回滾也不能恢復。也就是說delete是支援回滾的,也可以撤銷回滾;但是truncate不支援回滾。