麻烦大侠们给我一个详细一点的指导一下。如果单独一个事务我能了解
begin tran
begin try
xxx
commit tran
end try
begin catch
 rollbakc 
end catch
如果多个,还有触发器组合我该怎么处理触发器是事务吗?
怎么我写了一个下面的触发器create trigger tgr_t
on t
for inset
as
begin
xxxxxxxxxx
raiseeror('aaa',16,1,)
end但是我向t表插入数据时还是没有回滚。还有我如果在触发器里调用存储过程该怎么处理,存储过程里我都还敢用事务了,因为事务一嵌套我很不明白,怎么处理,
我现在都只是在里面要返回的地方rollback 这样可以中止,但我想这样可能不是正确的,如果,程序单独调用这个存储过程不是由触发器来调,那就会出问题吧

解决方案 »

  1.   

    那触发器嵌套存储过程时 存储过程内最好不用事务,在触发器里判断存储过程返回值进行rollback
      

  2.   

    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    IF OBJECT_ID('PROC1') IS NOT NULL DROP PROCEDURE PROC1
    GO
    CREATE TABLE TB(COL1 INT)
    GO
    CREATE PROCEDURE PROC1(@COL1 INT)
    AS
    BEGIN
    BEGIN TRAN
    INSERT INTO TB SELECT @COL1 
    COMMIT TRAN
    END
    GOBEGIN TRAN
    EXEC PROC1 1
    ROLLBACK TRAN
    SELECT COUNT(1) FROM TB 
    --0
      

  3.   

    触发器里可以直接回滚~不用事务啊
    create trigger trig_insert
    on tt
    for insert
    as
      declare    @a varchar(20),    @b varchar(20),    @c varchar(20),@d varchar(20)
      select @a=a,@b=b,@c=c from inserted
      
      if exists (select 1 from #tt where a=@a and b=@b)
      begin
        select @d=c from #tt where a=@a and b=@b
        
        if exists (select 1 from (select * from split(@c,'/')) a 
            left join (select * from split(@d,'/')) b on a.textstr=b.textstr where b.id is not null)
        begin
            print '有重复,插入失败!'
            rollback tran        return
        end
        else
            print '插入成功!'
      end
    go--测试
    -------------------------------------------------
    insert into tt values('LL', 'ss0', '2/5/3')
    -------------------------
    有重复,插入失败!
    消息 3609,级别 16,状态 1,第 1 行
    事务在触发器中结束。批处理已中止。insert into tt values('LL', 'ss0', '2/9/3')
    ------------------------
    插入成功!(1 行受影响)
      

  4.   


    CREATE  TRIGGER  delete_stuON  studentFOR  DELETEASDECLARE  @rowcount  intSELECT  @rowcount =@@ROWCOUNTIF  @rowcount > 1   BEGIN      ROLLBACK  TRANSANCTION      RAISERROR( ' 你要删除的数据记录为%d条,一次只能删除一行数据,删除失败!' , 16 , 1 , @rowcount )   END
    执行这条语句成功:DELETE student FROM student WHERE stuNo='120801'当执行这条语句时就会出错:DELETE student FROM student WHERE stuNo>'120811'
      

  5.   


    回复7楼:因为你删的是一个集合 要考虑用游标读取deleted表中的信息再进行删除
      

  6.   

    你用了rollback 当然会回滚了。
      

  7.   

    这样理解,那不是事务可以一直不设任何标识 嵌套下去了。
    你看看下面就会报错了。
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    IF OBJECT_ID('PROC1') IS NOT NULL DROP PROCEDURE PROC1
    GO
    CREATE TABLE TB(COL1 INT)
    GO
    CREATE PROCEDURE PROC1(@COL1 INT)
    AS
    BEGIN
    BEGIN TRAN
    INSERT INTO TB SELECT @COL1 
    if exists(select 1 from tb)
    rollback tran
    else
    commit tran
    END
    GOBEGIN TRAN
    insert into tb select 12
    EXEC PROC1 1
    --ROLLBACK TRAN
    commit tran
    SELECT COUNT(1) FROM TB