多了怕各位看起来麻烦贴90行这一段吧
-------------------------------------------------------
CLOSE OrderProgramCursor
DEALLOCATE OrderProgramCursor
PRINT '22 @@TRANCOUNT='+CONVERT(VARCHAR,@@TRANCOUNT)
ROLLBACK TRANSACTION
PRINT '23 @@TRANCOUNT='+CONVERT(VARCHAR,@@TRANCOUNT)
RETURN -------------------------------------------------------
PRINT 是我刚加上的
结果是
22 @@TRANCOUNT=2
23 @@TRANCOUNT=0
也就是说
执行 ROLLBACK TRANSACTION
以后
@@TRANCOUNT直接从2变到0为什么不是1!!

解决方案 »

  1.   

    Transact-SQL 参考  
    @@TRANCOUNT
    返回当前连接的活动事务数。语法
    @@TRANCOUNT返回类型
    integer注释
    BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。示例
    下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。BEGIN TRANSACTION
    UPDATE authors SET au_lname = upper(au_lname)
    WHERE au_lname = 'White'
    IF @@ROWCOUNT = 2
       COMMIT TRANIF @@TRANCOUNT > 0
    BEGIN
       PRINT 'A transaction needs to be rolled back'
       ROLLBACK TRAN
    END
    请参见BEGIN TRANSACTIONCOMMIT TRANSACTIONROLLBACK TRANSACTION系统函数©1988-2000 Microsoft Corporation。保留所有权利。
      

  2.   

    commit太多,或者rollback重复。如果着急解决问题,可以把所有的rollback前面都加上 if @trancount>0 就不应该出错了。不过最好还是理清思路,找出设计问题,不要凑合。
      

  3.   

    要注意,不论有多少层事务,一个rollback就将它们全部回滚,并不是只回滚最后的那一个。