从另一个调用的存储过程是否阻止SQL Server中的调用过程?

时间:2015-05-27 19:55:12

标签: sql-server

进行调试,我想知道是否是这种情况。

基本上,这就是我所拥有的:

CREATE TABLE
    SomeTable (col INT PRIMARY KEY)
GO

CREATE PROCEDURE
    Procedure_A 
    @var int
AS
    BEGIN
        DELETE FROM 
            SomeTable
        WHERE 
            @var = col
    END
GO

CREATE PROCEDURE
    Procedure_B
    @var int
AS
    BEGIN
        EXEC Procedure_A @var
        INSERT INTO
            SomeTable (col)
        VALUES
            (@var)
    END
GO

我可以确定在执行insert语句之前Procedure_A已完成吗?

1 个答案:

答案 0 :(得分:1)

EXEC命令是同步的,这意味着在调用过程完成之前,下一个语句不会启动。可能会发生的情况是,如果两个单独的会话几乎同时调用Procedure_B,则可能会遇到问题,因为调用Procedure_A和插入语句时没有显式事务。所以这样的事情可能会发生:

  • 会话1致电Procedure_B
  • 会话2使用相同的值Procedure_B
  • 呼叫@var
  • 会话1执行Procedure_A并删除记录
  • 会话2执行Procedure_A,删除不执行任何操作
  • 会话1执行插入
  • 会话2执行插入并因主键违规而失败。

这称为种族状况或种族危险。您可以通过在事务中包装Procedure_B的内容来避免这种情况。