2013-01-08 62 views
0

我有一種情況,我需要從表中選擇一些記錄,將這些記錄的主鍵存儲在臨時表中,並按順序對記錄應用排它鎖以確保沒有其他會話處理這些記錄。我使用鎖定提示完成了這個操作:SQL Server:鎖定select語句返回的所有記錄

begin tran 
insert into #temp 
select pk from myTable with(xlock) 
inner join otherTables, etc 
(Do something with records in #temp, after which they won't be candidates for selection any more) 
commit 

問題是還有很多記錄被鎖定而不是必要的。我只想只有鎖定實際插入到臨時表中的記錄。我最初在表上設置了一個標誌來指示該記錄正在使用中(與使用鎖提示相反),但這有問題,因爲如果情況阻止了一個或多個記錄的處理,數據庫將處於無效狀態。

回答

0

也許設置不同的隔離級別,並使用rowlock表提示是你在找什麼?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

WITH (ROWLOCK) 

也許結合XLOCK和ROWLOCK可能做的伎倆?

文檔說:

XLOCK

指定獨佔鎖要採取和保持到事務>完成。如果使用ROWLOCK,PAGLOCK或TABLOCK進行指定,則獨佔鎖適用於>適當的粒度級別。

雖然我還沒有嘗試過。