【資料庫——鎖】

我是太陽啦啦啦發表於2017-01-22

前言:

你把它不放在心上,你就永遠不清楚它。這是這個階段自己最深刻的體會,當我們學習知識的時候,就是要親密的接觸它,這樣收穫的知識才是自己的!

核心:

首先先來了解一下事務的缺陷:

一、事務的缺陷

1.丟失更新(lose update)

兩個程式都是先讀取後更新,一個程式不知道另一個程式的存在,一個程式可能會覆蓋另一個程式的更新。

2.髒讀(dirty read)

是指讀未提交的資料。一個程式更新了資料但在另一個程式讀取相同的資料前未提交的更新。

3.不可重複讀(unrepeateable read)

也稱為不一致的分析,同一個事務的兩次讀取中,程式讀取相同的資源得到不同的值。

4.幻讀(Phantom Read)

當事務不是獨立執行時發生的一種現象。A事務修改了資料,B事務也修改了資料,事務提交後,A事務的使用者發現表中還沒有被修改的資料行,好像發生了幻覺一樣。

為了防止這些問題,引入資料庫併發控制技術。鎖是併發控制技術的一種。由此引出了鎖,接下來,我們一起來看看鎖。

二、鎖的概念

鎖的基本原則:允許一個事務更新資料。

三、鎖的類別

1.共享鎖(shared lock,S):

情景:用於不更改資料的操作(只讀操作)

特點:可以被其他使用者讀取,但無法被其他使用者修改。

2.更新鎖(update lock,U):

情景:用於可能被更新的資源中,防止多個事務在讀取、鎖定以及隨後可能進行的更新操作時發生死鎖。

特點:同一時刻只能有一個事務可以獲得資源的更新鎖。

3.排他鎖(exclusive lock,X):

情景:用於資料修改操作。

特點:與所有鎖模式互斥,以確保不會同時對同一資源進行多重更新。

4.意向鎖(intent lock):

情景:用於建立鎖的層次結構

特點:獲取共享鎖或排他鎖

5.架構鎖(Schema locks):

情景:在執行依賴於表架構的操作時使用

6.大容量更新鎖(bulk update lock,BU):

特點:允許多個會話向表中大容量載入資料,同時阻塞程式對該表執行大容量載入以外的操作。

 

四、死鎖及其防止

處理死鎖的最好方法,防止死鎖的發生。需要遵循的原則:

1.儘量避免併發的執行涉及到資料庫修改資料的語句(少併發修語句

2.要求每個事務一次就將所有要使用的資料全部加鎖,否則就不予執行(一次加鎖)

3.預先規定一個加鎖的順序。所有的事務,都必須按這個順序對資料進行加鎖。(規定加鎖順序)

4.每個事務的執行時間不可太長,儘量縮短事務的邏輯處理過程,及早提交或回滾事務。對程式段長的事務可以考慮將其分割為幾個事務。(縮短處理過程)

5.對一般不要修改的SQL Server事務的預設級別。不推薦強加鎖。(預設級別)

總結:

不斷總結中,感謝大家的閱讀!

相關文章