UPDATE 時, 如何避免資料定位處理被阻塞

2021-08-22 05:21:28 字數 1528 閱讀 2667

問題描述:

資料庫pubs中的authors表,想鎖定city為aaa的記錄,為什麼執行下面的命令後,city為bbb的記錄也被鎖定了,無法進行update.

begin

transaction

select

*from authors

with

(holdlock

)where city=

'aaa'

如何才能鎖定city為aaa的記錄,而且city為bbb的記錄依然能select和update?

問題分析:

應該不是被鎖住,應該只是檢索資料的時候,需要從aaa的記錄掃瞄到bbb的記錄,而aaa被鎖住了,所以掃瞄無法往下進行,這樣看起來似乎就是bbb也被鎖住了。

當然,也有可能確實是被鎖住了,sql server的鎖定預設是行級的,如果你的資源不足,則可能導致鎖自動公升級為頁級甚至表級鎖,這樣會導致更多的記錄被鎖定。

使用下面的語句, 如果能讀出資料, 則多半是第1種情況.

select

*from

authors with

(readpast)

where

city=

'bbb'

如果讀不出資料, 則一般是第2種情況.

問題解決方法:

讓select

和update

走不同的索引,這樣在update

的時候,不用掃瞄已經鎖定的資料就可以定義到記錄,update

也就不會被阻塞了

指定索引用類似下面的語句:

select

*from

authors with

(holdlock

,index

=索引名)

where

city=

'aaa'

update

a set

xx = xx

from

authors a with

(index

=索引名)

where

city=

'bbb'

當然,要保證僅掃瞄索引就可以定義到記錄,否則可能還是會被阻塞。

補充

對於熟悉sql server鎖的讀者,可以通過sp_lock,或者查詢系統表master.dbo.syslocks、master.dbo.syslockinfo來確定行為。

UPDATE 時, 如何避免資料定位處理被阻塞

問題描述 資料庫pubs 中的authors 表,想鎖定 city 為aaa 的記錄,為什麼執行下面的命令後,city 為bbb 的記錄也被鎖定了,無法進行 update.begin transaction select from authors with holdlock where city a...

sqoop匯出資料時如何選擇update key

在增量匯出模式下,無論是allowinsert模式還是updateonly模式,都需要設定update key allowinsert模式 該模式下生成的是insert語句,從這個角度講update key是沒有作用的,但是在cdh sandbox上測試時發現,如果不指定update key則會導致...

TP5中update時避免驗證字段重複的解決方法

比如當你修改乙個前台輪播圖的資訊,其他資訊要修改後,只有排序這個關鍵字段不需要修改 排序在資料庫中字段為sort,字段資料為1 2 3 4 但是在驗證裡邊寫了unique驗證規則 排序不能重複 那麼此時修改某條資訊時就會顯示排序不能重複的在驗證器裡寫自定義的報錯資訊 此處排序就是前台輪播圖要顯示的順...