SQL Server 2008 with(nolock)的使用原因及數據庫鎖,隔離級別簡介

首先先要了解併發訪問:同一時間有多個用戶訪問同一資源,併發用戶中如果有用戶對資源做了修改,此時就會對其它用戶產生某些不利的影響,例如:
1:髒讀,一個用戶對一個資源做了修改,此時另外一個用戶正好讀取了這條被修改的記錄,然後,第一個用戶放棄修改,數據回到修改之前,這兩個不同的結果就是髒讀。
2:不可重複讀,一個用戶的一個操作是一個事務,這個事務分兩次讀取同一條記錄,如果第一次讀取後,有另外用戶修改了這個數據,然後第二次讀取的數據正好是其它用戶修改的數據,這樣造成兩次讀取的記錄不同,如果事務中鎖定這條記錄就可以避免。

3:幻讀,指用戶讀取一批記錄的情況,用戶兩次查詢同一條件的一批記錄,第一次查詢後,有其它用戶對這批數據做了修改,方法可能是修改,刪除,新增,第二次查詢時,會發現第一次查詢的記錄條目有的不在第二次查詢結果中,或者是第二次查詢的條目不在第一次查詢的內容中。

爲了避免併發訪問產生的不利影響,SQL Server有兩種併發訪問的控制機制:鎖、行版本控制,表後面加nolock是解決併發訪問的方案之一。

(一) 鎖的介紹

每個事務對所依賴的資源會請求不同類型的鎖,它可以阻止其他事務以某種可能會導致事務請求鎖出錯的方式修改資源。當事務不再依賴鎖定的資源時,鎖將被釋放。

鎖的類型:

1:表類型:鎖定整個表;

2:行類型:鎖定某個行;

3:文件類型:鎖定某個數據庫文件;

4:數據庫類型:鎖定整個數據庫;

5:頁類型:鎖定8K爲單位的數據庫頁。

鎖的分類還有一種分法,就是按用戶和數據庫對象來分:
1). 從數據庫系統的角度來看:分爲獨佔鎖(即排它鎖),共享鎖和更新鎖
1:共享 (S) :用於不更改或不更新數據的操作(只讀操作),一般常見的例如select語句。
2:更新 (U) :用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
3:排它 (X) :用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。
2). 從程序員的角度看:分爲樂觀鎖和悲觀鎖。
1:樂觀鎖:完全依靠數據庫來管理鎖的工作。
2:悲觀鎖:程序員自己管理數據或對象上的鎖處理。
SQLServer通過設置事務的隔離級別自動管理鎖的設置和控制。鎖管理器通過查詢分析器分析待執行的sql語句,來判斷語句將會訪問哪些資源,進行什麼操作,然後結合設定的隔離級別自動分配管理需要用到的鎖。

(二)行版本控制

當啓用了基於行版本控制的隔離級別時,數據庫引擎 將維護修改的每一行的版本。應用程序可以指定事務使用行版本查看事務或查詢開始時存在的數據,而不是使用鎖保護所有讀取。通過使用行版本控制,讀取操作阻止其他事務的可能性將大大降低。也就是相當於針對所有的表在查詢時都會加上nolock,同樣會產生髒讀的現象,但差別在於在一個統一管理的地方。說到了基於行版本控制的隔離級別,那什麼是隔離級別

隔離級別的用處:控制鎖的應用,即什麼場景應用什麼樣的鎖機制。
最終目的:解決併發處理帶來的種種問題。

隔離級別的分類:

Read  Uncommitted:讀未提交數據(這個通常很少用)使用這種隔離級別並不是說在讀取或者更新數據的時候不加鎖其實還是加鎖的,只是在執行完操作之後馬上釋放鎖。而不是等到事務結束之後再釋放。對於共享鎖,排他鎖都是這樣。
Read Committed:讀已提交數據(這個很常用,也常是數據庫默認的設置)這種隔離級別共享鎖在讀取數據之後馬上釋放。。而排他鎖則是在事務結束的時候再釋放。
Repeatable Read:可重複讀這種隔離級別共享鎖和排他鎖都是在事務結束的時候再釋放的。因此叫“可重複讀”,即一個事務所讀取的數據是不會被別的事務更新的。。。在事務執行過程中任何時候都可以讀取剛纔讀過的數據。讀過的數據是不會被改變的,直到事務結束。
Serializable:串行化
 
發佈了26 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章