Microsoft SQL Server(以下簡稱SQL Server)作為一種中小型資料庫管理系統,已經得到了廣泛的應用,該系統更強調由系統來管理鎖。在用戶有SQL請求時,系統分析請求,自動在滿足鎖定條件和系統性能之間為資料庫加上適當的鎖,同時系統在運行期間常常自動進行優化處理,實行動態加鎖。 對 ...
Microsoft SQL Server(以下簡稱SQL Server)作為一種中小型資料庫管理系統,已經得到了廣泛的應用,該系統更強調由系統來管理鎖。在用戶有SQL請求時,系統分析請求,自動在滿足鎖定條件和系統性能之間為資料庫加上適當的鎖,同時系統在運行期間常常自動進行優化處理,實行動態加鎖。 對於一般的用戶而言,通過系統的自動鎖定管理機制基本可以滿足使用要求,但如果對數據安全、資料庫完整性和一致性有特殊要求,就必須自己控制資料庫的鎖定和解鎖,這就需要瞭解SQL Server的鎖機制,掌握資料庫鎖定方法。 鎖的多粒度性以及鎖升級 資料庫中的鎖是指一種軟體機制,用來指示某個用戶(也即進程會話,下同)已經占用了某種資源,從而防止其他用戶做出影響本用戶的數據修改或導致資料庫數據的非完整性和非一致性。這兒所謂資源,主要指用戶可以操作的數據行、索引以及數據表等。根據資源的不同,鎖有多粒度(multigranular)的概念,也就是指可以鎖定的資源的層次。SQL Server中能夠鎖定的資源粒度包括:資料庫、表、區域、頁面、鍵值(指帶有索引的行數據)、行標識符(RID,即表中的單行數據)。 採用多粒度鎖的重要用途是用來支持併發操作和保證數據的完整性。SQL Server根據用戶的請求,做出分析後自動給資料庫加上合適的鎖。假設某用戶只操作一個表中的部分行數據,系統可能會只添加幾個行鎖(RID)或頁面鎖,這樣可以儘可能多地支持多用戶的併發操作。但是,如果用戶事務中頻繁對某個表中的多條記錄操作,將導致對該表的許多記錄行都加上了行級鎖,資料庫系統中鎖的數目會急劇增加,這樣就加重了系統負荷,影響系統性能。因此,在資料庫系統中,一般都支持鎖升級(lock escalation)。所謂鎖升級是指調整鎖的粒度,將多個低粒度的鎖替換成少數的更高粒度的鎖,以此來降低系統負荷。在SQL Server中當一個事務中的鎖較多,達到鎖升級門限時,系統自動將行級鎖和頁面鎖升級為表級鎖。特別值得註意的是,在SQL Server中,鎖的升級門限以及鎖升級是由系統自動來確定的,不需要用戶設置。
SQL Server鎖類型
1) HOLDLOCK: 在該表上保持共用鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。
2) NOLOCK:不添加共用鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或“臟數據”,這個選項僅僅應用於SELECT語句。
3) PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。
4) READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。預設情況下,SQL Server 2000 在此隔離級別上操作。
5) READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,
READPAST僅僅應用於READ COMMITTED隔離性級別下事務操作中的SELECT語句操作。
6) READUNCOMMITTED:等同於NOLOCK。
7) REPEATABLEREAD:設置事務為可重覆讀隔離性級別。
8) ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。
9) SERIALIZABLE:用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。
10) TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL Server在該語句執行完後釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。
11) TABLOCKX:指定在表上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。
12) UPDLOCK :指定在 讀表中數據時設置更新 鎖(update lock)而不是設置共用鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),並且保證在後來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。