設置與查看sql server中鎖的超時時間(ZT)


在數據庫的應用系統中,死鎖是不可避免的。通過設置死鎖的處理優先級方法,可以在數據庫引擎中自動檢測到死鎖,對發生的死鎖會話進行干預,從而達到解除死鎖的目點,但在這種情況下,會話只能被動的等待數據庫引擎的自我檢查。

我們是否可以讓會話自身也擁有處理死鎖的主動權呢?這就是設置鎖的超時時間。當一個會話與另一個會話沖突引阻塞時,如果等待的時間超過指定的值,則該會話自動取消,並釋放數據庫資源。這樣,就達到了解決死鎖的目的。

那么如何來查看鎖的超時時間呢?利用@@lock_timeout函數即可: 可以看一下@@LOCK_TIMEOUT的語法與定義:

@@LOCK_TIMEOUT--返回當前會話的當前鎖超時設置,單位為毫秒。

返回類型--integer

解釋說明: SET LOCK_TIMEOUT 允許應用程序設置語句等待阻塞資源的最長時間。當一條語句已等待超過LOCK_TIMEOUT所設置的時間,則被鎖住的語句將自動取消,並給應用程序返回一條錯誤信息。

比如,我們要查看一個會話的超時時間,可以利用以下sql來查看:

select @@LOCK_TIMEOUT

在沒有設置過超時時間的情況下,該語句會返回結果-1,代表沒有超時時間。

那么又如何設置超時時間呢?可以利用以下sql語句:

set lock_timeout <鎖超時時間 >

注意: 1,鎖超時時間是以毫秒為單位的。 2,設置的超時時間只對當次會話有效。 可以做一個簡單的測試,在microsoft sql server management中打開一個查詢窗口,執行

set lock_timeout 2600 select @@lock_timeout

可以看到返回結果為2600毫秒,然后再打開一個新的查詢窗口(即一個新的會話),執行

select @@lock_timeout

返回結果為-1,可見前一個會話的設置對當前的會話無效。

如果將鎖超時間設置為0,那么在發生資源鎖定時,會話將不做任何等待,直接返回1222錯誤。

使用鎖超時的不足之處: 如果我們有設置了鎖超時時間,那么當會話等待時間達到超時時間時,就會直接返回1222錯誤,而且不會回滾或取消當前事務。需要我們在應用程序中截獲1222錯誤,再作相關處理。如果我們在應用程序中未做任何處理,則事務會繼續運行,從而導致程序的邏輯錯誤,因為前面有的語句可能根本沒有執行或未執行完整。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM