SQL Server 2005中的奇怪锁定行为

时间:2011-06-20 09:11:21

标签: sql-server-2005 locking

任何人都可以告诉我为什么即使对第一个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

SomeTableSomeValue介于5和10之间的任何值都将返回两次,即使它们已锁定在第一个SELECT中。我认为整个事务的锁都已到位,所以我没想到查询会返回重复的结果。为什么会这样?

1 个答案:

答案 0 :(得分:1)

在同一个会话/事务中,READPAST不会产生任何影响。

所以即使你有第一个SELECT的ROWLOCK和UPDLOCK,下一个SELECT也会忽略它们。如果第二个SELECT是一个不同的会话,那么它将按预期工作。

有关详细信息,请参阅以下内容:ORDER BY and WITH(ROWLOCK, UPDLOCK, READPAST)TABLOCKX versus SERIALIZABLE