鎖定和阻塞

1.鎖數據庫

鎖是事務獲取的一種控制資源,用於數據資源,防止其餘事務對數據進行衝突的或不兼容的訪問。服務器

鎖模式及其兼容性session

排他鎖(exclusive lock),共享鎖(shared lock);還有一些其餘類型的鎖(更新鎖,意向鎖、架構鎖)。架構

當試圖修改數據時,事務會爲所依賴的數據資源請求排他鎖,一旦授予,事務將一直持有排他鎖,直至事務完成。這種鎖模式之因此稱爲排他鎖,是由於對於相同的數據資源,若是有其餘事務已經得到了該資源的任何類型的鎖,就不能再得到該資源的排他鎖;若是有其餘事務已經得到了該資源的排他鎖,就不能再得到該資源的任何類型的鎖。這是修改行爲的默認處理方式,並且這種默認行爲不能改變——不能改變爲修改數據資源而請求鎖模式(排他鎖),也不能改變持有的時間長度(直到事務完成)。函數

當試圖讀取數據時,事務默認會爲所依賴的數據資源請求其享鎖,讀操做一完成,就當即釋放資源上的共享鎖。這種鎖模式之因此稱爲共享鎖,是由於多個事務能夠同時持有同一數據資源上的共享鎖。雖然當修改數據時不能改變請求的鎖模式和持續時間,但當讀取數據時能夠對如何處理鎖定進行控制。rest

事務之間的相互制約關係就是鎖的兼容性。server

排他鎖和共享鎖的兼容性:若是數據正在由一個事務進行修改,其餘事務就既不能修改該數據,也不能讀取(至少默認不能)該數據,直到第一個事務完成。若是數據正在由另外一個事務讀取,其餘事務就不能修改該數據(至少默認不能)。對象

可鎖定資源的類型blog

 SQL Server 能夠鎖定不一樣類型或粒度的資源,這些資源類型包括RID 或KEY(行)、PAGE(頁)、對象(例如,表)、數據庫等。行位於頁中,而頁則是包含表或索引數據的物理數據塊。索引

2. 檢測阻塞

若是一個事務持有某一數據資源上的鎖,而另外一事務請求相同資源上的不兼容的鎖,則對新鎖的請求將被阻塞,發出請求的事務進入等待狀態。在默認狀況下,被阻塞的請求會一直等待,直到原來的事務釋放相關的鎖。

只要可以在合理的時間範圍內知足請求,系統中的阻塞就是正常的。可是,若是一些請求等待了太長的時間,可能就須要手工排除阻塞狀態,看看能採起什麼措施來防止這樣長時間的延遲。例如,事務的運行時間過長,會致使持有鎖的時間也太久;這時能夠嘗試縮短事務處理,把不屬於工做單元的操做移到事務外面。在某些狀況下,應用程序中的bug也可能致使事務一直打開;這時能夠先把這樣的bug找出來,修復它,確保在全部狀況下均可以關閉事務。

要獲得有關鎖的信息(包括已經授予的鎖和當前會話正等待授予的鎖),能夠在動態管理視圖(DMV,dynamic management view)sys.dm_tran_locks;

SELECT

  request_session_id AS spid,

  resource_type AS restype,

  resource_database_id AS dbid,

  DB_NAME(resource_database_id) AS dbname,

  resource_description AS res,

  resource_associated_entity_id AS resid,

  request_mode AS mode,

  request_status AS status

FROM sys.dm_tran_locks;

每一個會話都由唯一的服務器進程標識符(SPID,server process ID)進行標識,能夠經過查詢@@SPID函數來查看會話的SPID。

相關文章
相關標籤/搜索