我有一个存储过程,需要设置一个保存点,以便它可以,在某些情况下,撤消它所做的一切,并返回一个错误代码给调用者,或接受/提交并将成功返回给调用者。但是,无论呼叫者是否已经开始交易,我都需要它。该文件在这个问题上非常混乱。这是我认为会起作用的,但我不确定所有的后果。SAVE TRANSACTION vs BEGIN TRANSACTION(SQL Server)如何嵌套事务很好
东西是 - 这个Stored Procedure (SP)
被别人调用。所以我不知道他们是否已经开始交易...即使我要求用户开始交易以使用我的SP,我仍然有关于正确使用Save Points
的问题...
我的SP将测试交易是否正在进行,如果没有,请从BEGIN TRANSACTION
开始。如果一个交易已经在进行中,它将会创建一个保存点,并且保存这个事实,这就是我所做的。
然后如果我必须回滚我的更改,如果我早些时候做了BEGIN TRANSACTION
,那么我会ROLLBACK TRANSACTION
。如果我做了保存点,那么我会ROLLBACK TRANSACTION MySavePointName
。这种情况似乎很好。
这里我有点困惑 - 如果我想保持我所做的工作,如果我开始交易,我将执行COMMIT TRANSACTION
。但是,如果我创建了一个保存点?我试过COMMIT TRANSACTION MySavePointName
,但随后呼叫者尝试提交其交易,并得到一个错误:
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
所以我不知道那么 - 保存点可以回滚(即作品:ROLLBACK TRANSACTION MySavePointName
将不会回滚调用者的交易)。但也许人们从不需要“承诺”呢?它只停留在那里,以防需要回滚到原始事务,但在原始事务被提交(或回滚)后会消失?
如果有一种“更好”的方式来“嵌套”一个交易,请说明一下。我还没有想出如何嵌套BEGIN TRANSACTION
,但只有回滚或提交我的内部交易。似乎ROLLBACK
将始终回滚到最高交易,而COMMIT
只是递减@@trancount
。
你发现可能是值得张贴作为一个答案。 – 2012-03-16 08:49:22
@Andriy好的,那就是我所做的 - 删除我的编辑并将其用作答案。谢谢。 – 2012-03-16 21:13:22