我前端开发的程序没有采用自动提交
begin transction
     update table_name1 set ....
     if sqlcode <> 0 rollback;     update table_name2 set ....
     if sqlcode <> 0 rollback;
   
    update table_name3 set ....
     if sqlcode <> 0 rollback;
commit transaction现在的问题是,比如所当执行到语句 1 的使用,客户端死机。mssqlserver服务是回滚还是提交该记录。
我知道,如果是Oracle,这样的update语句会被回滚的。而我们的mssqlserver现场服务器好像是给预提交
而不是回滚
我们的sqlserver2005企业版32位的。
大家有没有遇到这方面的事情?

解决方案 »

  1.   

    启用xact_abort,可实现自动回滚,set xact_abort on
    begin tran
     [update语句1]
     [update语句2]
     [update语句3]
    commit tran
      

  2.   

    参考楼上的方法是用xact_abort遇到错误自动回滚整个事物
      

  3.   

    #1.如果死机不是由SQL SERVER引起的。你提交后,在服务器端很快就完成了事务并提交,这时,客户端断电,没有把结果取走,那么就回滚不了了。
    #2. 死机时,例如执行到了SQL1。如果这时两边的连接断了,那么SQL SERVER应该会发现并回滚,如果没有断,应该会继续执行。
    #3.有了SET XACT_ABOR选项应该,楼主可以少写点儿代码了
    set xact_abort on
    官方解释:它用于指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。 如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 OFF 是默认设置。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 访问接口(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。 唯一不需要该选项的情况是在提供程序支持嵌套事务时。
      

  4.   

    如果执行到一般由于网络问题断了,那么会自动回滚。但是由于其他的比如constraint violation错误,那么
    只会回滚出错的语句,前面已经执行的不会回滚。所以使用 SET XACT_ABOR比较保险。 
     
      

  5.   

    不是存储过程,是程序外面书写的sql语句,是cs的mis程序。
    一条一条语句执行的。只是在每条语句后面会判断是否有错误。
    现在发现是在执行语句1 或语句2之后死机。这个时候语句3还没被执行,数据还没有
    被更改,但是语句1的update或语句2的update已经提交了。百思不得其解
      

  6.   

    If an error prevents the successful completion of a transaction, SQLServer automatically rolls back the transaction and frees all resources held bythe transaction. If the client's network connection to an instance of theDatabase Engine is broken, any outstanding transactions for the connection arerolled back when the network notifies the instance of the break. If the clientapplication fails or if the client computer goes down or is restarted, thisalso breaks the connection, and the instance of the Database Engine rolls backany outstanding connections when the network notifies it of the break. If theclient logs off the application, any outstanding transactions are rolled back.If a run-time statement error (such as a constraint violation) occurs in abatch, the default behavior in the Database Engine is to roll back only thestatement that generated the error. You can change this behavior using the SETXACT_ABORT statement. After SET XACT_ABORT ON is executed, any run-timestatement error causes an automatic rollback of the current transaction.Compile errors, such as syntax errors, are not affected by SET XACT_ABORT. Formore information, seeSET XACT_ABORT (Transact-SQL)
      

  7.   

    cs程序的客户端已经开启了事务。我认为这是sqlserver的bug.不可靠
      

  8.   

    如果是客户端死机连不到数据库而数据库又没有执行成功,整个事物取消而不是后面的不成功。你可以测试一下:
    create table  testrollback(id int primary key, name varchar(10))begin tran 
    insert into testrollback values (1,'test')
    WAITFOR DELAY '00:01';
    insert into testrollback values (2,'test')
    commit tran 比如执行到20秒的时候你断开客户端跟服务器的链接,然后登陆服务器看一下其实已经插入了一条数据,但是数据库无法连接到客户端的时候,SQL Server会回滚整个事物,你会发现第一条记录又没了。 
      

  9.   

    你可以测试一下:
    create table  testrollback(id int primary key, name varchar(10))begin tran 
    insert into testrollback values (1,'test')
    WAITFOR DELAY '00:01';
    insert into testrollback values (2,'test')
    commit tran 比如执行到20秒的时候你断开客户端跟服务器的链接,然后登陆服务器看一下其实已经插入了一条数据,但是数据库无法连接到客户端的时候,SQL Server会回滚整个事物,你会发现第一条记录又没了。 
    你这种是批指令。我是在cs程序的客户端开一个事务,一条一条语句执行的。按ms的理论是没有问题,但实际却如我说的那样。把前面两句的提交了。没有回滚
      

  10.   

    SET XACT_ABORT  ON 學習了
      

  11.   

    不是批处理,是前边delphi的程序使用adoquery执行一条一条的update语句。理论上讲不通,应该回滚的
      

  12.   

    照理是应该回滚的。实在不行,就试试这个吧;
    set xact_abort on
    begin tran
     update语句1
     update语句2
     update语句3
    commit tran这个xact_abort的特点在于,只要update中的任一语句更新失败,都会自动回滚的,你就不用在update后,每次都需要判断一下,是否有错误了
      

  13.   

    用 SET XACT_ABOR比较保险
      

  14.   

    发现确实是sqlserver的问题。使用 SET XACT_ABOR就行了。原因是在执行了 update,传递到服务器之后,客户端一下就死机了。服务器的会话一直处于网络传输状态。这种情况会持续很长时间。当杀掉这个会话的时候,就会提交
      

  15.   

    加set xact_abort on没错的,我在1楼就回复了,可惜被LZ忽视了.