SQL Server 是存在丢数据的情况。
所以不是代码的问题,是数据库的问题!

解决方案 »

  1.   

    create proc ...
    as
    begin
        begin tran
        insert table1 ...
        if @@error<>0
         ROLLBACK TRAN
        insert table2 ...
        if @@error<>0
         ROLLBACK TRAN
        commit tran
    end
      

  2.   

    --因为出现不严重错误时,sql会忽略错误继续执行下去,所以用楼主的方法不能保证数据一致性--可以这样改
    create proc ...
    as
    set xact_abort  on   --加上这句,这样在出现错误时,会终止并回滚事务
    begin
        begin tran
        insert table1 ...
        insert table2 ...
        commit tran
    end
      

  3.   

    --或者这样写:create proc ...
    as
    begin
        begin tran
        insert table1 ...
        if @@error<>0
    begin
         ROLLBACK TRAN
    return  --出错时,要回滚事务并退出处理,否则一样会执行后面的语句
    end    insert table2 ...
        if @@error<>0
    begin
         ROLLBACK TRAN
    return
    end
        commit tran
    end
      

  4.   

    create proc ...
    as
    begin
        begin tran
        insert table1 ...
        if @@error<>0 goto sqlerr
        insert table2 ...
        if @@error<>0
         goto sqlerr
        commit tran
    end
    return
    sqlerr:
       rollback tran
       return
      

  5.   

    create proc ...
    as
    begin
        begin tran
        insert table1 ...
        if @@error<>0 goto sqlerr
        insert table2 ...
        if @@error<>0
         goto sqlerr
        commit tran
    return
    sqlerr:
       rollback tran
       returnend
      

  6.   

    不一定要加rollback吧?
    它可能嵌套在其他transaction中,我看rollback是取消到最开始的beign tran那里,
    这里rollback会不会影响上层的transaction?导致调用这个存储过程之前的没有提交,而它之后的被提交了这种?