我有一个名为“Is_Locked”的列。
我打开2个SSMS,每个人都用这个脚本创建一个新的查询:
BEGIN TRAN Nima1
BEGIN TRY
DECLARE @a INT
SELECT @a=COUNT(*)
FROM dbo.Siahe WITH(XLOCK,ROWLOCK)
WHERE TedadDaryaii=8
AND Is_Locked=1
IF @a = 0
BEGIN
UPDATE Siahe
SET Is_Locked = 1
WHERE ShMarja = 9999
END
COMMIT TRAN Nima1
END TRY
BEGIN CATCH
ROLLBACK TRAN Nima1
END CATCH
但是如果所有Is_Lock字段都是 false ,那么查询执行和Select语句都不会独占锁定行。
为什么?
答案 0 :(得分:1)
如果@a
= 0,则第一个查询中有0个匹配的行。这些行中的所有0个都是独占锁定的。我对你的select和update语句中的不同条件感到有些困惑。如果在两者中都使用相同的条件,我建议如下:
UPDATE Siahe
SET Is_Locked = 1
WHERE
Is_Locked = 0 and
/* Other Conditions */
IF @@ROWCOUNT = 1
BEGIN
PRINT 'We got the lock'
END
ELSE
BEGIN
PRINT 'Someone else has the lock'
END