c# 回滚 sql存储过程回滚哪个好,现在在网络不太好或其它未知情况下,在SQL存储过程里加的set xact_abort on 回滚没用,一个过程里先插入,后更新,往往出现插入了但是没有更新。
所以想问到底是要写在代码里?还是存储过程写的有问题。代码里是FOR 循环 提交的数据。

解决方案 »

  1.   

    1.最好写在存储过程中,因为代码的本质也是调用sql的事务
    2.问题在你的for循环中
    3.如果是循环提交,多次提交,应该合并为一次提交,然后把它放到事务中去
    4.采用显式事务
    begin tranrollback tran
    commit tran仔细寻找问题,估计问题就快解决了
      

  2.   

    丝毫不需要写。不要画蛇添足。只需要在ado.net调用时使用transaction就行了。就算你发送了命令之后,然后把网线拔掉了,数据库系统也会自动回滚事务的,用不着任何一个代码去些什么rollback指令。
      

  3.   

    你画蛇添足地写了,反而要跑到csdn问如何诊断哪里有问题,你说这悲剧不悲剧?事务机制本身就会防止以为崩溃的,当commit没有执行完毕之前,与数据库联系的会话崩溃时,事务就会自动回滚的,用不着你写任何rollback代码。
      

  4.   

    同时,数据库系统的执行异常也会反馈到.net客户端程序,从而让程序根本执行不到commit就自动回滚了。另外当你只有一条sql语句调用,sql server会自动产生一个事务。所以这个时候你甚至在.net客户端代码中根本不用显示地去new一个DBTransaction对象实例,不用调用其Commit代码,也是可以保证事务的(数据库端有bug也不会让事务提交的)。这个sql语句当然也包括调用存储过程。所以不要在你的存储过程中些什么commit、rollback语句。除非你使用存储过程做操作系统长期轮询的任务管理(我想一千个编程人员中难得有两三位去写这样的存储过程)。
      

  5.   

    路过 学习
    顺便问下 ADO.net的transaction是什么?
      

  6.   

    目前在代码里没有写回滚的,按您的说法是 存储过程里也不用写事务了?
    只有一条sql语句调用,sql server会自动产生一个事务——现在一个过程里有是先插入后更新。现在是反反复复的出现这些问题,所以求救,请大侠不吝赐教。
      

  7.   

    AS 
    set xact_abort on
    begin tran txdeclare @rowcount int--返回执行行数
    set @rowcount = 0declare @err intset @err = 0……
    insert into set @err=@err+@@errorbegin 
    ……
    update 
    ……
    endIF @err <> 0 
       rollback tran tx
    else
       commit tran tx
      

  8.   

    事务里面的错误代码有没有写错?
    INSERT INTO
    set @err=@err+@@error
    UPDATE SET
    set @err=@err+@@errorIF @err<>0 回滚...
      

  9.   

    差之厘毫,失之千里IF @@ERROR <> 0  
      rollback tran tx
    else
      commit tran tx
      

  10.   

    他这样累计错误应该也是没有错的,UPDATE的时候是不是没有积累错误了
    这样一起回滚的时候,插入和更新要么全部失败要么全部成功
      

  11.   

    谢谢,UPDATE 的时候累计了的:
    begin
    ……
    set @err=@err+@@error
    end
      

  12.   

    主体就是这样:begin tran
    declare @err int
    set @err = 0
    -------插入
    insert into
    ……
    set @err=@err+@@error
    ————更新
    update set @err=@err+@@error
    ——回滚
    IF @err <> 0 
       rollback tran 
    else
       commit tran 
      

  13.   

    这种解决方案有很多重复的处理,特别是如果你的业务逻辑需要2个以上的T-SQL语句时。比较优雅的解决方案是组合所有的代码,使用一个通用的错误处理。CREATE PROCEDURE addTitle(@title_id VARCHAR(6), @au_id VARCHAR(11),     
                              @title VARCHAR(20), @title_type CHAR(12))    
    AS   
       
    BEGIN TRAN    
        INSERT titles(title_id, title, type)    
        VALUES (@title_id, @title, @title_type)    
       
        IF (@@ERROR <> 0) BEGIN   
            PRINT 'Unexpected error occurred!'   
            ROLLBACK TRAN    
            RETURN 1    
        END   
       
        INSERT titleauthor(au_id, title_id)    
        VALUES (@au_id, @title_id)    
       
        IF (@@ERROR <> 0) BEGIN   
            PRINT 'Unexpected error occurred!'   
            ROLLBACK TRAN    
            RETURN 1    
        END   
       
    COMMIT TRAN    
       
    RETURN 0