任何人都可以告诉我为什么即使对第一个SELECT
语句使用的行进行锁定,给定存储过程中的以下语句也会返回重复的结果?
BEGIN TRANSACTION
DECLARE @Temp TABLE ( ID INT )
INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue <= 10
INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue >= 5
SELECT * FROM @Temp
COMMIT TRANSACTION
SomeTable
中SomeValue
介于5和10之间的任何值都将返回两次,即使它们已锁定在第一个SELECT
中。我认为整个事务的锁都已到位,所以我没想到查询会返回重复的结果。为什么会这样?
答案 0 :(得分:1)
在同一个会话/事务中,READPAST不会产生任何影响。
所以即使你有第一个SELECT的ROWLOCK和UPDLOCK,下一个SELECT也会忽略它们。如果第二个SELECT是一个不同的会话,那么它将按预期工作。
有关详细信息,请参阅以下内容:ORDER BY and WITH(ROWLOCK, UPDLOCK, READPAST)和TABLOCKX versus SERIALIZABLE