2011-06-20 5 views
0

誰でも、最初のSELECTステートメントで使用される行のロックでも、指定されたストアドプロシージャ内の次のステートメントが繰り返しの結果を返すのはなぜですか?SQL Server 2005での奇妙なロックの動作

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 

SomeValueは5と10の間であるためSomeTable内の任意の値は、それらが最初SELECTにロックしたとしても、二回返されます。トランザクション全体でロックがかかっていると思っていましたので、クエリが繰り返し結果を返すことは期待していませんでした。なぜこうなった?

答えて

1

同じセッション/トランザクションでは、READPASTは効果がありません。

したがって、最初のSELECTに対してROWLOCKとUPDLOCKがあっても、次のSELECTはこれらを無視します。 2番目のSELECTが別のセッションだった場合、期待どおりに動作します。

詳細はORDER BY and WITH(ROWLOCK, UPDLOCK, READPAST)TABLOCKX versus SERIALIZABLE