怎样处理SQL Server 的事务回滚? 比如同时UPDATE 两个表,更新一个,另一个没有更新,引起数据不一致?

解决方案 »

  1.   

    Database1.StartTransaction;
        try
          query1.ApplyUpdates; 
          query2.ApplyUpdates;
          query3.ApplyUpdates;
    //...      Database1.Commit; {on success, commit the changes};
        except
          Database1.Rollback; {on failure, undo the changes};
          raise; {raise the exception to prevent a call to CommitUpdates!}
        end;
      query1.CommitUpdates; {on success, clear the cache}
      query2.CommitUpdates; {on success, clear the cache}
      query3.CommitUpdates; {on success, clear the cache}
    //...
      

  2.   

    请问 chechy(为程序而奋斗):假如是三层架构的,客户端用ClientDataSet时怎样处理呢? 帮帮忙吧!
      

  3.   

    做个存储过程吧,根本不需要用delphi写
      

  4.   

    DataBase1.StartTrasaction;
     try
      ...
      DataBase1.Commit;
     except
      DataBase1.Roolback;
     end;只要事务回滚了,决不会出现你所说的数据不一致(哪怕是事务处理中突然断电了);要不然事务处理(Transaction)是干什么吃的,DBMS是干什么吃的。三层结构是一样的。只要你按上面的格式写事务处理,要么全部提交,要么全部不提交,这就叫事务的原子性。
      

  5.   

    如果是主从结构,那么很简单,在Server端做主从结构,然后再Client端只有一个ClientDataset,这样只要
    cds1.ApplyUpdates(0);
    就可以了,剩下的都是Delphi做了。
    如果是多个表,那就麻烦了,参看D5DG的MIDAS章节,Dan Miser在其中很好的解决了。
      

  6.   

    原子性老兄不用置疑了
    如果想进一步控制,用这个事件好了
    procedure TForm1.ClientDataSet1ReconcileError(
      DataSet: TCustomClientDataSet; E: EReconcileError;
      UpdateKind: TUpdateKind; var Action: TReconcileAction);
    beginend;
      

  7.   

    建议用ADO连接!ADOConnection!
    Try
      ADOConnection.BeginTrans;{??}
      ...
      ADOConnection.CommitTrans;{提交}
      Except
        ADOConnection.RollbackTrans;{回滚}
    end;{Try}