假设我有一个管理自己事务的存储过程

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

如果我从现有事务调用此过程,该过程可以回滚外部事务。

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

如何在存储过程中正确确定事务范围,以便存储过程不会回滚外部事务?

有帮助吗?

解决方案

执行此操作的语法可能因数据库而异。但在 Transact-SQL 中,您要做的是检查 @@TRANCOUNT 来查看您是否处于事务中。如果是,那么您想要创建一个保存点,最后您可以直接通过函数的末尾(相信稍后会发生提交或回滚),或者回滚到您的保存点。

请参阅 Microsoft 的文档 保存点 了解更多。

对保存点的支持相当广泛,但我认为用于发现您当前处于事务中的机制(假设有一个)会有很大不同。

其他提示

输入时使用@@trancount查看您是否已经处于交易状态

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top