adoconnection1接sql的服务器1
adoconnection2接sql的服务器2
现在的操作是先在服务器1里插入操作
然后在服务器1里更新操作两台服务器是在不同的地方的,那么我现在做的是要保证这两个操作要么全做,要么什么也不做,不能出现服务器1里插入了但服务器2里面没更新这种情况,
这怎么来写delphi事务

解决方案 »

  1.   

    数据库的事务,DELPHI里面没有的,两个数据库两个COMMIT,但是存在一个COMMIT以后另一个ROLLBACK的问题。
      

  2.   

    -------------------通用函数--------------------------------
    function G_BeginTran(const adocnn: TADOConnection): boolean;
    begin
      Result := FALSE;
      try
        if adocnn.InTransaction then
        begin
          adocnn.RollbackTrans;
          Exit;
        end;
        adocnn.BeginTrans;
        Result := TRUE;
      except
      end;
    end;function G_CommitTran(const adocnn: TADOConnection): boolean;
    begin
      Result := FALSE;
      try
        if not adocnn.InTransaction then Exit;
        adocnn.CommitTrans;
        Result := TRUE;
      except
        G_RollTran(adocnn);
      end;
    end;function G_RollTran(const adocnn: TADOConnection): boolean;
    begin
      result := false;
      try
        if not adocnn.InTransaction then Exit;
        adocnn.RollbackTrans;
        result := true;
      except
      end;
    end;-----------------------------------------------------------------------------
    ...
    if not (G_BeginTran(adoconnection1) and G_BeginTran(adoconnection2)) then exit;
    if not 服务器1里插入操作失败 then 
    begin
      G_RollTran(adoconnection1);
      G_RollTran(adoconnection2);
      exit;
    end;
    if 服务器2里更新操作失败 then 
    begin
      G_RollTran(adoconnection1);
      G_RollTran(adoconnection2);
      exit;
    end;
    if not (G_CommitTran(adoconnection1) and G_CommitTran(adoconnection2)) then
    begin
      G_RollTran(adoconnection1);
      G_RollTran(adoconnection2);
      exit;
    end;
    ...
      

  3.   

    我觉得你应该换个思路。在服务器1里把服务器2加为链接服务器,用一个adoconnection连接服务器1,在delphi中写带事务的多表联合查询sql语句,而且要注意的是,服务器1与服务器2应在一个网段。
      

  4.   

    事务是在数据库里面才有的,delphi里没有事务这个概念的
      

  5.   

    楼主完可以MSSQL自带的订阅分发功能呀。
      

  6.   

    我的数据库操作全在delphi中进行的,不能用订阅功能