Mysql事務以及加鎖機制

oufu發表於2015-12-20

事務的特徵ACID,即原子性、一致性、隔離性、永續性。

原子性保證一個事務為一個最小的單元,內部不可分割;

一致性保證事務中的每個操作執行緒不可單獨提交,成功則一起提交,不成功則事務回滾;

隔離性保證不同事務間看到的資料檢視相互獨立,相互隔離(隔離級別可設定);

永續性保證事務提交後資料會持久的儲存下來;

 

sql規範定義的事務的隔離級別:

1.READ UNCOMMITTED(讀取未提交內容)

    所有事務可以看到未提交事務的執行結果,本隔離級別很少用到實際應用中,讀取未提交的資料,又稱為“髒讀”。

2.READ COMMITTED(讀取提交內容)

    大多數資料庫的預設隔離級別是此級別,但不是mysql預設的。一個事務在開始的時候只能看見已提交事務所做的改變。一個事務從開始到提交前所做的任何改變都是不可見的,除非提交。這種隔離級別也稱為不可重複讀。

3.REPEATABLE READ(可重複讀)

    鎖定查詢中使用的所有資料以防止其他使用者更新資料,但是其他使用者可以將新的幻像行插入資料集,且幻像行包括在當前事務的後續讀取中。此級別也稱為“幻讀”。

4.SERIALIZABLE(可序列化)

    可序列化是最高的隔離級別,它通過強制事務排序,使之不可重讀,解決了幻讀的問題。此隔離級別會在每個讀的資料行上加共享鎖,使用這種隔離級別會產生大量的超時現象,一般實際開發中不會用到。


mysql加鎖機制 :

根據型別可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。

根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由儲存引擎實現。

 

mysql提供了3種事務型儲存引擎,InnDB、NDB Cluster和Falcon。

一個事務執行的任何過程中都可以獲得鎖,但是隻有事務提交或回滾的時候才釋放這些鎖。這些都是隱式鎖定,也可以顯式鎖定,InnoDB支援顯式鎖定,例如:

SELECT .... LOCK IN SHARE MODE (加共享鎖)

SELECT .....FOR UPDATE(加排他鎖)

 

多版本併發控制(重要):

Mysql的事務儲存引擎不是簡單實用行加鎖機制,而是叫多版本併發控制(MVCC)技術,和行加鎖機制關聯實用。以便應對更高的併發,當然是以消耗效能作為代價。

每種儲存引擎對MVCC的實現方式不同,InnoDB引擎的簡單實現方式如下:

InnoDB通過為每個資料航增加兩個隱含值的方式來實現。這兩個隱含值記錄了行的建立時間,以及過期時間。每一行儲存事件發生時的系統版本號。每一次開始一個新事務時版本號會自動加1,每個事務都會儲存開始時的版本號,每個查詢根據事務的版本號來查詢結果。

相關文章