1. 程式人生 > >sqlserver程序死鎖的解決辦法(一)

sqlserver程序死鎖的解決辦法(一)

之前查了很多資料,一般都是在select 語句新增with(nolock)即可,但是如果是呼叫一些原始碼jar包,可是包裡面的方法沒有新增with(nolock),那麼久沒有辦法了,例如之前我做工工作流,呼叫的是activiti的jar包,它對於ibatis的呼叫,預設是不加with(nolock)的,所以,當兩個以上系統,同時操作一個庫的時候,就會發生死鎖現象,因為查詢的欄位沒有新增索引,查詢的時候不加with(nolock)的是全表,所以,還有一種辦法可以解決,就是

給查詢的欄位新增索引,通過索引查詢,鎖的是行。

沒索引的,就是掃描全表了

當對有影響的屬性都新增索引後,那麼執行sql操作的時候鎖的就是行了,這樣只要不是操作同一行資料,就不會發生死鎖了。類似我遇到的問題,雖然是兩個系統操作同一個資料庫,但是不會操作同一行資料,所以就不會發生死鎖現象。

總結:

死鎖的發生,主要是兩個程序分別對一些資源加了鎖,同時又請求對方枷鎖的資源造成的現象,目前就我的知識來說,解決的辦法,找到下面介個:

(1)理清思路,儘量不要有幾個系統同時使用一個數據庫,這樣很難設定事物的隔離級別,並且把控資料庫SQL的執行順序。

(2)select操作,一定要新增with(nolock);

 (3)在可能發生死鎖的資源上新增索引,這樣就不會發生鎖全表的情況。新增的是行鎖。