select @@trancount触发器本身就是事务内的。而不是全局的。

解决方案 »

  1.   

    @@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
      

  2.   

    @@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
      

  3.   

    每次进入触发器,@@TRANCOUNT 就增加 1,即使在自动提交模式下也是如此。(系统将触发器视作隐性嵌套事务。)