存储过程中适当范围的事务

时间:2020-03-06 14:23:57  来源:igfitidea点击:

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

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

如果我从现有事务中调用此proc,则proc可以回滚外部事务。

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

如何在存储过程中适当地限制事务的范围,以使存储过程不会回滚外部事务?

解决方案

输入时使用@@ trancount查看我们是否已经在交易中

这样做的语法可能因数据库而异。但是在Transact-SQL中,我们要做的是检查@@ TRANCOUNT以查看我们是否正在事务中。如果要创建一个保存点,那么最后可以通过该函数的结尾(相信以后会进行提交或者回滚),否则回滚到保存点。

有关更多信息,请参见Microsoft有关保存点的文档。

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