共享鎖與排它鎖

共享鎖【S鎖】
又稱讀鎖,若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

排他鎖【X鎖】
又稱寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

共享鎖與排它鎖區別

1.共享鎖只用於表級,排他鎖用於行級。 
2.加了共享鎖的對象,可以繼續加共享鎖,不能再加排他鎖。加了排他鎖後,不能再加任何鎖。 
3.比如一個DML操作,就要對受影響的行加排他鎖,這樣就不允許再加別的鎖,也就是說別的會話不能修改這些行。同時爲了避免在做這個DML操作的時候,有別的會話執行DDL,修改表的定義,所以要在表上加共享鎖,這樣就阻止了DDL的操作。 
4.當執行DDL操作時,就需要在全表上加排他鎖

上面都是一些概念性的東西,下面我從事務的隔離級別上討論一下這兩種鎖:

事務有四大隔離級別(隔離級別由高到低):

(1)Serializable(串行化):一個事務在執行過程中完全看不到其他事務對數據庫所做的更新(事務執行的時候不允許別的事務併發執行。事務串行化執行,事務只能一個接着一個地執行,而不能併發執行。)。
(2)Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,但是不能看到其他其他事務對已有記錄的更新。
(3)Read Commited(讀已提交數據):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,而且能看到其他事務已經提交的對已有記錄的更新。
(4)Read Uncommitted(讀未提交數據):一個事務在執行過程中可以看到其他事務沒有提交的新插入的記錄,而且能看到其他事務沒有提交的對已有記錄的更新。

他們到底實現了是麼樣的鎖呢?我們一個一個看:

SERIALIZABLE(序列化)

 

添加範圍鎖(比如表鎖,頁鎖等,關於range lock,我也沒有很深入的研究),直到transaction A結束。以此阻止其它transaction B對此範圍內的insert,update等操作。

 

幻讀,髒讀,不可重複讀等問題都不會發生。

 

REPEATABLE READ(可重複讀)

 

對於讀出的記錄,添加共享鎖直到transaction A結束。其它transaction B對這個記錄的試圖修改會一直等待直到transaction A結束。

 

可能發生的問題:當執行一個範圍查詢時,可能會發生幻讀。

 

READ COMMITTED(提交讀)

 

在transaction A中讀取數據時對記錄添加共享鎖,但讀取結束立即釋放。其它transaction B對這個記錄的試圖修改會一直等待直到A中的讀取過程結束,而不需要整個transaction A的結束。所以,在transaction A的不同階段對同一記錄的讀取結果可能是不同的。

 

可能發生的問題:不可重複讀。

 

READ UNCOMMITTED(未提交讀)

 

不添加共享鎖。所以其它transaction B可以在transaction A對記錄的讀取過程中修改同一記錄,可能會導致A讀取的數據是一個被破壞的或者說不完整不正確的數據。

 

另外,在transaction A中可以讀取到transaction B(未提交)中修改的數據。比如transaction B對R記錄修改了,但未提交。此時,在transaction A中讀取R記錄,讀出的是被B修改過的數據。

 

可能發生的問題:髒讀。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章