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

2021-06-16 00:13:06 字數 1724 閱讀 5339

問題描述

:

資料庫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

來確定行為。

trackback:

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

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

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

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

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

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