此 SQL 语句对于并发访问安全吗?

Is this SQL Statement Safe for Concurrent Access?

'safe'下面的SQL语句是否为并发访问? A 什么时候会被锁定?如果它就在 INSERT 之前,第一个 @count 是否有可能是错误的?

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;
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 在提交事务之前创建一个锁,这使得其他进程等待。

希望对您有所帮助!