防止存储过程中的插入被调用者回滚

问题描述 投票:0回答:1

我创建了一个带有如下插入的存储过程:

CREATE PROCEDURE MyProcedure
    ... my Params ....
AS
BEGIN
    SET NOCOUNT ON;

    
    INSERT INTO MyTable 
        ....

        Do some more stuff here
END

现在 MyProcedure 被另一个过程调用,有点像这样:

BEGIN TRANSACTION

do some stuff ....

EXECUTE @return_value = MyProcedure

do some more stuff ...

IF(@return_value < 0)
BEGIN
   ROLLBACK
END

通过此设置,如果 MyProcedure 中出现错误,则会执行回滚,并且我的插入也会回滚。问题是 INSERT 是一种日志,让我知道哪些数据进入了 MyProcedure。 我不知道将来谁会调用 MyProcedure,因此即使调用者正在执行回滚,也能确保我的 INSERT 确实发生,这会很棒。有什么我可以做的吗?

sql sql-server stored-procedures
1个回答
0
投票

您有 2 个目标,但有 1 笔交易。他们是矛盾的。 您需要从 Transaction 语句外部调用 MyProcedure。

记录是一个单独的过程。您需要记录过程调用失败或成功。所以分开2个过程。

首先使用工作参数调用日志记录过程,无需显式事务语句。

然后调用实际交易流程。

EXECUTE @return_value = MyProcedure   -- first process

BEGIN TRANSACTION    -- second process

do some stuff ....

EXECUTE @return_value = MyProcedure

do some more stuff ...

IF(@return_value < 0)
BEGIN
   ROLLBACK
END
© www.soinside.com 2019 - 2024. All rights reserved.