client中,用到socketConnection,clientDataSet1,dataSource1,clientDataSet2,dataSource2,
分别连接server中的table1,table2.
server中用ADOConnection,ADOTable1,ADOTable2,DataSetProvider1,DataSetProvider2.
现在要想用事务处理,实现两个表要么都保存,要么都不保存(防止断电),怎么办??
顺便问下,以下client,server中所用的控件是否合理,请指点,谢谢!!!!!!!!

解决方案 »

  1.   

    ADOConnection有事务处理功能,另:socketConnection是什吗东西
      

  2.   

    这问题为何出现在Delphi 非技术区,什吗意思
      

  3.   

    回复人: Erice(白雪公猪) ( ) 信誉:88  2004-12-31 13:21:00  得分: 0  
     
     
       在分布式中使用事务会在多客户并发时造成错误!!!
    你可以考虑先使用保存到本地的内存表,再向服务器提交,就可以解决你提出的问题
      
     
    请问这个时候要怎么向服务器提交??是否应该一次性提交上去,当多个表同时提交时同样可能出现问题??
    感谢以上各位的回答!!!!!!
      

  4.   

    写一个导出函数来解决, 大概像下面这样子
    Update(Delta1, Delta2: OleVariant);
    var
      ErrorCount: Integer;
    begin
      ADOConnection.BeginTrans;
      try
        // 有点矛盾的是充许发生几个错的情况, 如果一个错都不能发生就像下面    DataSetProvider1.ApplyUpdates(Delta1, 0, ErrorCount);
        if ErrorCount > 0 then raise Exception.Create(...);
       
        DataSetProvider2.ApplyUpdates(Delta2, 0, ErrorCount);
        if ErrorCount > 0 then raise Exception.Create(...);    ADOConnection.Commit;
      except
        ADOConnection.Rollback;
        raise; // 报告客户机
      end;
    end;客户机这边COMObject.Update(Cds1.Detla, Cds2.Delta);
    Cds1.MergeChangeLog;
    Cds2.MergeChangeLog;有错就不会 MergeChangeLog, 还可以改
      

  5.   

    用ADOConnection来处理事务我有用过,但现在问题出现在客户端,是不是应该在客户端解决就行???
      

  6.   

    事务不能用在客户端 start 和 commit, 也不是说不能, 客户机作起来问题太多, 一次性提交更新数据, 让服务端作
      

  7.   

    为什么要用adoconnection的事务呢?
    好象多层中不应该用吧,最好是用com的事务,但偶不会
    希望大侠指点!
      

  8.   

    回复人: comanche(太可怕) ( ) 信誉:154  2004-12-31 13:40:00  得分: 0  
     
     
       事务不能用在客户端 start 和 commit, 也不是说不能, 客户机作起来问题太多, 一次性提交更新数据, 让服务端作  
     
    那请问如何一次性提交呢,现在是要两个表同时处理?? 回复人: wozhuchuanwei(四库全输) ( ) 信誉:100  2004-12-31 13:41:00  得分: 0  
     
     
       为什么要用adoconnection的事务呢?
    好象多层中不应该用吧,最好是用com的事务,但偶不会
    希望大侠指点!
      
    服务器端可以用ADOConnection,我也是问别人的,呵呵
      

  9.   

    com+ 事务也能解决这种问题, 如果你指定了对像成 require transaction那 ADOConnection.BeginTarns 那些就不要
    改成try
      ...
      SetComplete;
    except
      SetAbort;
      raise;
    end;com+ 事务好处在于如果上面操作是两个对像, dsp1(obj1) 和 dsp2(obj2) 在两个对像里, 又希望是一个事务完成操作, 可以写如下代码(大概)设 obj1, obj2 成 support transaction, 为了正常操作时, 并不想用到事务情况写个中间对像obj3.Update(李维书上有说, 叫协调对像), 写法各不同, 这个设成 require transactionobj3.Update
    begin
      try
        obj1 := CreateCOMObject(ProgIDToClassID(...));
        obj2 := CreateCOMObject(ProgIDToClassID(...));    obj1.ApplyUpdate
        obj2.ApplyUpdate
        
        SetComplete;
      except
        SetAbort;
        raise;
      end;
    end;
      

  10.   

    to 楼主, 我上面有代码, 就是把 cds1.Delta, 和 cds2.Delta 一次提交, 服务器这边用一个事务控制的代码
      

  11.   

    回复人: comanche(太可怕) ( ) 信誉:154 非常感谢!!!
      

  12.   

    请问SetComplete;SetAbort;是怎么用的,老是出错?????
      

  13.   

    o, 还在问哈, SetComplete 和 SetAbort 是 Transactional data module 定义的, com 里没有, 不过也可以得到, 在 use 里加 mtx然后 GetObjectContext.SetComplete 和 SetAbort, 这样一写你的对像就是 COM+ 的了, COM 就不能用了(98不正常)
      

  14.   

    回复人: comanche(太可怕) ( ) 信誉:154 呵呵,其实我也还不明白,你能不能再帮我下,就是用一个Button来实现这两个表同时保存的功能,
    里面的Clicked事件:
    ...
    try
    ...
    DataModule1.ClientDataSet1.ApplyUpdates(0);
    DataModule1.ClientDataSet2.ApplyUpdates(0);
    except
    ...
    end;
    ...
    以上的模块要怎么写呢,谢谢!!!!!
      

  15.   

    try
    DataModule1.ClientDataSet1.ApplyUpdates(0);
    DataModule1.ClientDataSet2.ApplyUpdates(0);
    except
    DataModule1.ClientDataSet1.CancelUpdates;
    DataModule1.ClientDataSet2.CancelUpdates;
    end;
    我试过这样写好像可以,但不知道行不行得通??
    这里好像已经有了一个隐含事务在里面??