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

解决方案 »

  1.   

    BEGIN TRAN //事务1
    insert
    update
    COMMIT
    select 1
    BEGIN TRAN //事务2
    insert
    COMMIT
    select 2
      

  2.   

    看来真是奇怪了:create table tb(id int)
    go
    create trigger t on tb
    for insert
    as
    print @@TRANCOUNT
    go
    begin tran
    print @@TRANCOUNT
    insert into tb values(1)
    commit traninsert into tb values(1)go
    drop table tb/*--结果居然为:
    1(所影响的行数为 1 行)1(所影响的行数为 1 行)1--*/
      

  3.   

    触发器自己当然不是一个事务,它最多不过是个过程(只不过比存储过程高明的地方是知道inserted和deleted表)。触发器不会创建事务!!因为T-SQL语言会对不在事务之中的命令自动维护(启动和结束)一个事务,对于已经在事务之中的语句,这样干是多余的。
      

  4.   

    “触发器必然在事务中”并不是说每一个触发器自动启动一个事务,而是从SQL Server系统的命令处理机制中可以推论出这个判断结果。
      

  5.   

    T-SQL语言会对不在事务之中的命令
    ---------------------------------------> sorry,写错了。因该是:
    T-SQL语言会对不在事务之中的insert、update、delete命令
      

  6.   

    --这么说你可能明白一点:
    --环境:
    create table xx (a int)
    go
    create trigger t_xx_in
    for insert
    as
      insert yy values(...)
    go--语句:insert xx values(1)--实际在sqlserver中是:
    begin tran
      insert xx values(1)
      insert yy values(...) <<<====它们是一个事务。
    commit tran
      

  7.   

    --建立环境create table xx (a int)
    gocreate trigger t_xx_in on xx
    for insert
    as
      print @@trancount
    go--------------
    insert test values (1)结果是
    1
    说明sqlserver启动了一个隐式事务
    ------------------------
    begin tran
    print @@trancount
    insert test values (1)
    commit 
    结果是
    1
    1
    说明sqlserver启动了一个显示事务
    ----------------------
    begin tran
    begin tran
    print @@trancount
    insert test values (1)
    commit 
    commit结果是
    2
    2
    说明sqlserver启动了两个显示事务
      

  8.   

    --建立环境
    create table test(a int)
    gocreate trigger xx on test for insert
    as
    print @@trancount
    begin tran
    print @@trancount
    commit tran
    go---------------------------
    insert test values (1)
    结果是
    1
    2
    第一个1说明sqlserver启动一个隐式事务
    第二个2说明在触发器内部启动了一个显示事务
      

  9.   

    那还是没有解决这个问题,还有就是即使外部没有事务,
    re:
    你说单独一个insert语句有事务吗?

    它是一个隐式事务
    触发器自身也在事务中,那我如何判断这个事务是触发器外部,还是触发器内部的事务呢?
    re:
    触发器没有起用单独事务。