問題描述
:
資料庫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驗證規則 排序不能重複 那麼此時修改某條資訊時就會顯示排序不能重複的在驗證器裡寫自定義的報錯資訊 此處排序就是前台輪播圖要顯示的順...