2015-08-03 31 views
3

對於併發訪問,SQL語句低於'安全'嗎? A會在什麼時候被鎖定?如果只是在INSERT之前有第一個@count可能出錯的機會?此SQL語句對於併發訪問安全嗎?

BEGIN TRAN; 
    SELECT @count = count(1) from A 
    DELETE FROM A where x=z 
    SELECT @newCount = count(1) from A 
    SELECT @newCount - @count 
COMMIT TRAN; 
+0

這是一個人爲的例子。我知道我可以使用@@ ROWCOUNT – Ryan

+0

取決於RDMBs。 – usr

+0

這是SQL服務器(在這種情況下2012) – Ryan

回答

1
BEGIN TRAN; 
    DECLARE @RC INT 
    EXEC @RC = sp_getapplock @Resource='ArchiveLock', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout=15000 
    SELECT @count = count(1) from A 
    DELETE FROM A where x=z 
    SELECT @newCount = count(1) from A 
    SELECT @newCount - @count 
COMMIT TRAN; 

試試這個。我最近使用它來處理由多個進程並行調用的一組Delet語句。 sp_getapplock會創建一個鎖,直到事務被提交,使其他進程等待。

希望這會有所幫助!