raiserror就回滚了,为什么要这样写呢?

解决方案 »

  1.   

    这是简化后的内容,实际情况当然是有错误才回滚,就是不明白为什么会产生266错误,即:"EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。上一计数 = 1,当前计数 = 0。"
    这样写的目的是防止怀疑业务逻辑出了问题,因为上面的代码不涉及具体业务,只是简单的报错并回滚,为什么会出现错误呢?
      

  2.   

    exec作用域问题,外面的begin tran找不到rollback了
      

  3.   

    能解决吗?实在不行,也就只有把begin tran放到sql 语句里面去了
      

  4.   

    exec或者sp_executesql内部是一个scope,它的外部是另一个作用域
      

  5.   

    另外你的commit前不应该有return,这样你的事务才能被提交
      

  6.   

    sorry,明显我说错了,很久的帖了
    简单说:不要在潜逃事务里用rollbak or return,会让事务overalter PROCEDURE Test3AS
    BEGIN
    --申明一个字符串,内容为回滚事务,并报错
    declare @strSql nvarchar(1000)
    set @strSql='
    raiserror(''有错误产生!'',16,1)
    if @@ERROR =0
    begin
    commit transaction
    End
    '
    --开始事务
    begin tran
    exec (@strSql)
    if @@error <>0
    commit tran
    else
    rollback
    end 
      

  7.   

    alter PROCEDURE Test3 
    AS 
    BEGIN 
    --开始事务 
    declare @tran int
    set @tran=0
    begin tran 
    begin tran t1
    raiserror('有错误产生!',16,1) 
    set @tran=@@ERROR+@tran
    if @tran=0
    commit tran t1
    if @tran =0
    commit tran 
    else 
    rollback 
    end--嵌套这样写,内层不要rollback