Server:Tprovider TQuery
Client:TSocketConn,TClientdataset
不是调用用AppServer提供的方法需要Client本身来实现Transaction,如何做?

解决方案 »

  1.   

    在中间层的方法本身就处于一个Transaction中。
      

  2.   

    from mota骆la 
    multi-tier中的事务,和客户端关系不大
    服务器端的事务处理是自动的,它被remotedatamodual自动启动
    你不用多管,如果你要进行精确控制,需要在下面的事件中进行处理
    procedure TForm1.DataSetProvider1UpdateError(Sender: TObject;
      DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
      var Response: TResolverResponse);
    beginend;
    procedure TForm1.ClientDataSet1ReconcileError(
      DataSet: TCustomClientDataSet; E: EReconcileError;
      UpdateKind: TUpdateKind; var Action: TReconcileAction);
    beginend;
      

  3.   

    DataSetProvider1BeforeUpdaterecord事件中自动启动事务只要是同一个数据库,如果是两个不同的数据又要用控制两个事务了
      

  4.   

    在客户段如果使用TclientDataSet.Applyupdates 则自动起一个事务,是不能控制的.
      如果自己写SQl语句可以通过在服务器写一组接口方法,在客户端调用,完成事务控制.
      或者直接将SQL 语句传递到服务器中,那是则完全由你控制了.
      

  5.   

    其实,这个和客户端没有任何关系;我是这样想的;其实本来就是这样的;
    RDataModule已经完成了这些;特别是BDE/IDAPI在这方面做的相当出色;
    ProviderABeforUpdate里进行控制也成;
      

  6.   

    to ihihonline(小小->爱被下载中……) 
     如果客户段要求两个TClientDataSet的数据提交,并要求在一个事务中完成?
    这时就服务器会产生两个事务分别管理,怎样解决这个问题?
      

  7.   

    摩托来了  :)to  mengxc(mengxc)1。首先,如果出现象你所说的那样,你的系统结构本身不是很好,你的那种需求需要放在服务器端作为一个业务逻辑放入一个组件中进行事务处理,本身在客户端分开处理就有问题,applyupdate本身会产生事务,所以直接用clientdataset不可能实现两个update放入一个事务中2。如果非要如此,可以按下面的流程进行:(假设两个clientdataset进行更新)
    try
       备份clientdataset1的delta and data
       clientdataset1.applyupdate(-1);
       try
         clientdataset2.applyupdate(-1);
       except
         根据备份,恢复clientdataset1的内容,并重新更新数据库
         //要注意的是:恢复的时候仍可能出现异常,这就很难克服了,
          需要添加智能算法
       end;
    except

    end;