我在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。没有找到该名称的交易或保存点。“
这是某种功能,还是实际发生的事情? 提前谢谢
答案 0 :(得分:0)
我认为这是因为嵌套事务而发生的,并且SQL Server 2008不支持在transactions are nested时回滚到内部事务:
使用a命名一系列嵌套事务中的多个事务 事务名称对事务影响不大。只有第一个 (最外面的)事务名称已在系统中注册。回滚 到任何其他名称(有效保存点名称除外)生成 错误。在回滚之前执行的语句都没有 事实上,在发生此错误时回滚。声明是 仅在外部事务回滚时回滚。
您的事务是嵌套的,因为隐式事务设置启动一个,begin trans启动第二个(嵌套)事务。这使得回滚到指定的事务失败。