命名显式&隐式交易

时间:2012-11-12 22:28:38

标签: sql-server sql-server-2008

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

我有一个存储过程,我以名称@tran

开始显式事务

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

BEGIN TRAN @tran 如果@p_param为空  ROLLBACK TRAN @tran ....

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

“Msg 6401,Level 16,State 1,Line 10 无法回滚exp_tran。没有找到该名称的交易或保存点。“

这是某种功能,还是实际发生的事情? 提前谢谢

1 个答案:

答案 0 :(得分:0)

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

  

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

您的事务是嵌套的,因为隐式事务设置启动一个,begin trans启动第二个(嵌套)事务。这使得回滚到指定的事务失败。