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

时间:2008-09-18 23:06:17

标签: sql-server stored-procedures transactions scope

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

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

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

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

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

2 个答案:

答案 0 :(得分:2)

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

有关详情,请参阅Microsoft savepoints上的文档。

对保存点的支持相当普遍,但我认为找出您当前正在进行交易的机制(假设有一个)会有很大差异。

答案 1 :(得分:1)

使用@@ trancount查看您在进入

时是否已进入交易