2010-10-19 47 views
0

我遇到以下问题。我必须存储程序(调试消息双注):事务嵌套过程

CREATE PROC innerProc 
AS 
BEGIN 
     SELECT 'innerProc 1',@@TRANCOUNT 
    BEGIN TRAN 
     SELECT 'innerProc 2',@@TRANCOUNT 
    ROLLBACK 
     SELECT 'innerProc 3',@@TRANCOUNT 
END 

GO ----------------------------------------- 

CREATE PROC outerProc 
AS 
BEGIN 
     SELECT 'outerProc 1',@@TRANCOUNT 
    BEGIN TRAN 
     SELECT 'outerProc 2',@@TRANCOUNT 
    EXEC innerProc 
     SELECT 'outerProc 3',@@TRANCOUNT 
    ROLLBACK 
     SELECT 'outerProc 4',@@TRANCOUNT 
END 

GO ----------------------------------------- 

EXEC outerProc 

他们做什么?

  1. outerProc开始交易(@@ TRANCOUNT = 1)
  2. 执行innerProc(在PROC开头@@ TRANCOUNT = 1)
  3. innerProc开始另一个事务(@@ TRANCOUNT = 2)
  4. innerProc回滚事务(@@ TRANCOUNT = 0)
  5. 与这里的问题是:@@ TRANCOUNT在innerProc的开始不等于在结束时@@ TRANCOUNT。我究竟做错了什么?这是正确的方法吗?
+0

您是否曾经成功解决过这个问题?你还需要帮助吗? – jcolebrand 2010-12-14 03:44:47

+0

没有。它不适用于命名事务。我已经阅读了一些意见,我认为交易和程序不是一起工作的必要条件。 – 2010-12-14 12:49:49

回答

0

我相信你需要使用命名的交易,否则你会杀死所有的交易,当你回滚该嵌套之一,即使它的作用范围只内存储过程

http://msdn.microsoft.com/en-us/library/ms188929.aspx

进一步读:http://msdn.microsoft.com/en-us/library/ms181299.aspx

回滚事务未经 savepoint_name或transaction_name 辊回的开头 交易。在嵌套 事务时,此同样的语句 将所有内部事务回滚到 最外面的BEGIN TRANSACTION 语句。在这两种情况下,ROLLBACK TRANSACTION将@@ TRANCOUNT 系统函数递减为0. ROLLBACK TRANSACTION savepoint_name不会 递减@@ TRANCOUNT。