sqlserver程序死鎖的解決辦法(一)
阿新 • • 發佈:2019-02-18
之前查了很多資料,一般都是在select 語句新增with(nolock)即可,但是如果是呼叫一些原始碼jar包,可是包裡面的方法沒有新增with(nolock),那麼久沒有辦法了,例如之前我做工工作流,呼叫的是activiti的jar包,它對於ibatis的呼叫,預設是不加with(nolock)的,所以,當兩個以上系統,同時操作一個庫的時候,就會發生死鎖現象,因為查詢的欄位沒有新增索引,查詢的時候不加with(nolock)的是全表,所以,還有一種辦法可以解決,就是
給查詢的欄位新增索引,通過索引查詢,鎖的是行。
沒索引的,就是掃描全表了
當對有影響的屬性都新增索引後,那麼執行sql操作的時候鎖的就是行了,這樣只要不是操作同一行資料,就不會發生死鎖了。類似我遇到的問題,雖然是兩個系統操作同一個資料庫,但是不會操作同一行資料,所以就不會發生死鎖現象。總結:
死鎖的發生,主要是兩個程序分別對一些資源加了鎖,同時又請求對方枷鎖的資源造成的現象,目前就我的知識來說,解決的辦法,找到下面介個:
(1)理清思路,儘量不要有幾個系統同時使用一個數據庫,這樣很難設定事物的隔離級別,並且把控資料庫SQL的執行順序。
(2)select操作,一定要新增with(nolock);
(3)在可能發生死鎖的資源上新增索引,這樣就不會發生鎖全表的情況。新增的是行鎖。