进行调试,我想知道是否是这种情况。
基本上,这就是我所拥有的:
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
已完成吗?
答案 0 :(得分:1)
EXEC命令是同步的,这意味着在调用过程完成之前,下一个语句不会启动。可能会发生的情况是,如果两个单独的会话几乎同时调用Procedure_B
,则可能会遇到问题,因为调用Procedure_A
和插入语句时没有显式事务。所以这样的事情可能会发生:
Procedure_B
Procedure_B
@var
Procedure_A
并删除记录Procedure_A
,删除不执行任何操作这称为种族状况或种族危险。您可以通过在事务中包装Procedure_B
的内容来避免这种情况。