1.鎖
鎖是事務獲取的一種控制資源,用於資料資源,防止其他事務對資料進行衝突的或不相容的訪問。
鎖模式及其相容性
排他鎖(exclusive lock),共享鎖(shared lock);還有一些其他型別的鎖(更新鎖,意向鎖、架構鎖)。
當試圖修改資料時,事務會為所依賴的資料資源請求排他鎖,一旦授予,事務將一直持有排他鎖,直至事務完成。這種鎖模式之所以稱為排他鎖,是因為對於相同的資料資源,如果有其他事務已經獲得了該資源的任何型別的鎖,就不能再獲得該資源的排他鎖;如果有其他事務已經獲得了該資源的排他鎖,就不能再獲得該資源的任何型別的鎖。這是修改行為的預設處理方式,而且這種預設行為不能改變——不能改變為修改資料資源而請求鎖模式(排他鎖),也不能改變持有的時間長度(直到事務完成)。
當試圖讀取資料時,事務缺省會為所依賴的資料資源請求其享鎖,讀操作一完成,就立即釋放資源上的共享鎖。這種鎖模式之所以稱為共享鎖,是因為多個事務可以同時持有同一資料資源上的共享鎖。雖然當修改資料時不能改變請求的鎖模式和持續時間,但當讀取資料時可以對如何處理鎖定進行控制。
事務之間的相互制約關係就是鎖的相容性。
排他鎖和共享鎖的相容性:如果資料正在由乙個事務進行修改,其他事務就既不能修改該資料,也不能讀取(至少預設不能)該資料,直到第乙個事務完成。如果資料正在由另乙個事務讀取,其他事務就不能修改該資料(至少預設不能)。
可鎖定資源的型別
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。
鎖定和阻塞
鎖是事務獲取的一種控制資源,用於保護資料資源,防止其它事務對資料進行衝突的或不相容的訪問。我們目前只要學習兩種基本的鎖模式就可以,它們分別是共享鎖和排他鎖。共享鎖主要是在讀操作時使用,讀操作一旦完成,資料庫就會立即釋放資源上的共享鎖,而且多個事務可以同時持有同一資料資源上的共享鎖。而排他鎖主要是在修...
阻塞和非阻塞
在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...
阻塞和非阻塞
在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...