1

我在 SQL Server 2008 中遇到了一个小错误(功能)。

我有一个存储过程,我在其中以名称 @tran 开始显式事务

.... 声明 @tran varchar(30) = 'exp_trans';

BEGIN TRAN @tran IF @p_param 为空 ROLLBACK TRAN @tran ....

问题是,当我将 IMPLICIT_TRANSACTIONS 设置为 ON 并调用存储过程时,流程到达回滚部分,我将收到错误

“消息 6401,级别 16,状态 1,第 10 行无法回滚 exp_tran。找不到该名称的事务或保存点。”

这是某种功能,还是实际发生了什么?先感谢您

4

1 回答 1

0

我相信这是因为嵌套事务而发生的,并且 SQL Server 2008 不支持在事务嵌套时回滚到内部事务:

在一系列嵌套事务中用一个事务名命名多个事务对事务影响不大。只有第一个(最外面的)事务名称在系统中注册。回滚到任何其他名称(有效的保存点名称除外)都会产生错误。事实上,在回滚之前执行的所有语句都不会在发生此错误时回滚。仅当回滚外部事务时才回滚语句。

您的事务是嵌套的,因为隐式事务设置开始一个,begin trans 开始第二个(嵌套)事务。这使得回滚到命名事务失败。

于 2012-11-12T22:42:59.837 回答