我有一个存储过程,需要设置保存点(save point)以便在某些情况下撤消所有操作并向调用者返回错误代码,或接受/提交(accept/commit)操作并向调用者返回成功。但我需要它能够在调用者已经开始事务或尚未开始事务的情况下工作。文档对这个问题非常混乱。以下是我认为会起作用的方法,但我不确定所有细节。
问题在于-此存储过程(SP)由其他程序调用。因此,我不知道他们是否已经开始了事务...即使我要求用户在使用我的SP之前启动事务,我仍然对save points的正确使用有疑问。
我的SP将测试是否存在正在进行的事务,如果没有,则以BEGIN TRANSACTION开始一个事务。如果已经存在事务,则会创建一个save point,然后记录这一行为。然后,如果我必须撤消更改,如果我先前执行了BEGIN TRANSACTION,那么我会ROLLBACK TRANSACTION。如果我创建了save point,那么我就会ROLLBACK TRANSACTION MySavePointName。这种方案似乎非常有效。
这里是我有点困惑的地方-如果我想保留我所做的工作,如果我开始一个事务,我将执行COMMIT TRANSACTION。但如果我创建了一个保存点呢?我尝试了COMMIT TRANSACTION MySavePointName,但是调用者尝试提交其事务并收到错误:
“COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION。”
那么我想知道-保存点可以被回滚(这个方法有效:ROLLBACK TRANSACTION MySavePointName不会回滚调用者的事务)。但是也许永远不需要"commit"它?它只是保留在那里,以防您需要回滚到它,但是在原始事务提交(或回滚)后消失?如果有更好的嵌套事务的方法,请提供一些指导。我还没有找到如何使用BEGIN TRANSACTION进行嵌套操作,但只回滚或提交我的内部事务。似乎ROLLBACK将始终回滚到顶部事务,而COMMIT仅简单地减少@@trancount。
问题在于-此存储过程(SP)由其他程序调用。因此,我不知道他们是否已经开始了事务...即使我要求用户在使用我的SP之前启动事务,我仍然对save points的正确使用有疑问。
我的SP将测试是否存在正在进行的事务,如果没有,则以BEGIN TRANSACTION开始一个事务。如果已经存在事务,则会创建一个save point,然后记录这一行为。然后,如果我必须撤消更改,如果我先前执行了BEGIN TRANSACTION,那么我会ROLLBACK TRANSACTION。如果我创建了save point,那么我就会ROLLBACK TRANSACTION MySavePointName。这种方案似乎非常有效。
这里是我有点困惑的地方-如果我想保留我所做的工作,如果我开始一个事务,我将执行COMMIT TRANSACTION。但如果我创建了一个保存点呢?我尝试了COMMIT TRANSACTION MySavePointName,但是调用者尝试提交其事务并收到错误:
“COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION。”
那么我想知道-保存点可以被回滚(这个方法有效:ROLLBACK TRANSACTION MySavePointName不会回滚调用者的事务)。但是也许永远不需要"commit"它?它只是保留在那里,以防您需要回滚到它,但是在原始事务提交(或回滚)后消失?如果有更好的嵌套事务的方法,请提供一些指导。我还没有找到如何使用BEGIN TRANSACTION进行嵌套操作,但只回滚或提交我的内部事务。似乎ROLLBACK将始终回滚到顶部事务,而COMMIT仅简单地减少@@trancount。