Database1.StartTransaction
try
  table.append;
  table.fieldbyname('ss').asstring := '77';  
  table.post;
  Query2.close;
  Query2.clear;
  Query2.sql.add('update table2 set xixi="aa"');
  Query2.execsql;
  Database1.Commit;
except
  Database1.Rollback
  showmessage('异常错误');
end;Database1的事务处理,很奇怪.每次点提交出现 "异常错误后",在点提交,事务处理部份有些提交,有些没提交。并不是全部回滚,或者全部提交的。这个要怎么处理。我在except里 把exception,show出来。提示是连数据库超时(大部分情况下连接是正常的)。可能是服务器忙或者什么共它异常。这种情况应该怎么处理啊?

解决方案 »

  1.   

    Database1.StartTransaction
    try
      table.append;
      table.fieldbyname('ss').asstring := '77'; 
      table.post;
      Query2.close;
      Query2.clear;
      Query2.sql.add('update table2 set xixi="aa"');
      Query2.execsql;
      Database1.Commit;
    except
      begin
        Database1.Rollback;
        On E: Exception do
          showmessage(E.Message);
      end;
      
    end; 
      

  2.   

    为什么要加Database1.Commit; 这个会提交修改的
      

  3.   

    我要做的就是事务一起提交啊。一个增加一个修改。现在的问题是服务器响应时间超时的时候,提交不成功,紧接着就继续 做同样的操作,怪事就来了,table增加了,query没有更新,真的很奇怪!
      

  4.   

    判断下是否 inTransAction 是的话,开启事务前
      

  5.   

    有想过不过没用过,因为基本上每个界面都有事务处理。
       if Database1.InTransaction then
         Database1.Rollback;
    每次事务开始之前加这样一句,有点怕把其它的事务结回滚掉,存不存在这样的问题,同一电脑开多个相同程序
      

  6.   

    存不存在这样的问题,同一电脑开多个相同程序
    ==============================================不存在,除非你还有一个程序专门给这些程序提供连接。即使是同一个程序,不同的Connection也不会互相干扰。
      

  7.   

    如果是使用事务处理,最好不要使用eidt,post,append等。直接写sql
    insert,update等。
    另外
    except 
      on E:Exception do
      begin
        Database1.Rollback 
        showmessage('异常错误,'+E.message); 
      end;
    end; 
      

  8.   

    是的全是在Query里,update,post,insert的。最后都execsql提交的。可是就是这样写也是部份提交,部分没提交的。不知道什么原因,数据也就100多万条。服务器比较选,估计是服务器不响应,导致没法提交,操作员是看到无法提交,会一直点下去。
      

  9.   

    那出现我这种情况 
    if Database1.InTransaction then 
    判断如果是 InTransaction 是
    先回滚掉,还是把 InTransaction := false;
      

  10.   

    try
    ...
    except
        On e: Exception do
          ShowMessage(e.Message);  //把异常信息show出来
    end;
      

  11.   

    直接show出来我知道,但是我现在问题确确实实出现过好多次了。    loginfrm.Database1.StartTransaction;
        try
            Query8.last;
            while not Query8.bof do
            begin
              with Query2 do
              begin
                close;
                sql.Clear;
                sql.Add('update give set condition=''不合格流转结束'',sign=:p1,ssign=:p2,bhgfy=:p3,zjje=:p5,zjyy=:p6 where id=:p4');
                case combobox1.ItemIndex of
                  0: parambyname('p1').AsString := '1'  ;
                  1: parambyname('p1').AsString := '2'  ;
                end;
                parambyname('p2').AsString :=  '不合格流转结束,处理为:'+combobox1.Text;
                if strtofloat(edit20.Text) = fzd then //小与最低罚款金额按最低算,各记录平分
                begin
                  parambyname('p3').AsString :=  sAver;
                end
                else
                begin
                  parambyname('p3').AsString :=  formatfloat('0.00', Query8.fieldbyname('fy').AsFloat * 1.17 * rfbl);
                end;
                parambyname('p4').AsString :=  Query8.fieldbyname('id').AsString;
                if not RxCalcEdit1.Visible then
                begin
                  parambyname('p5').AsString := '0';
                  parambyname('p6').AsString := '';
                end
                else
                begin
                  parambyname('p5').value :=  RxCalcEdit1.value;
                  parambyname('p6').AsString :=  Edit3.Text;
                end;
                execsql;
              end;
              Query8.Prior;
            end;      with Query2 do
          begin
            close;
            sql.Clear;
            sql.Add('update ttask set isCompeleted=''2'' where taskID='''+staskid+'''');
            execsql;        close;                             //ssign
            sql.Clear;                                      //待处理(已检验完)                 //                     //,url,realresult  idetail,
            sql.Add('insert into ttask (iGive,templateID,templateName,taskName,userID,NextUserID,nodeResult,isCompeleted,sTime,skind,sMoney,sbl,sAdv,zjje,zjyy,NextUser) values ('); //不合格则设标记为1
            sql.Add(':p1,:p2,:p3,:p4,:p5,:p6,:p8,:p9,:p10,:p12,:p13,:p14,:p15,:p16,:p17,:p18)'); //:p7,:p11,
            Parambyname('p1').AsString  := sid;
            Parambyname('p2').AsString  := sdj;//Edit2.Text;
            Parambyname('p3').AsString  := '不合格单审批';
            Parambyname('p4').AsString  := '送财务扣款人员(不合流转结束)!';
            Parambyname('p5').AsString  := mainfrm.StatusBar.Panels[7].Text;
            Parambyname('p6').AsString  := combobox3.Text;
            Parambyname('p8').AsString  := memo4.Text;
            Parambyname('p9').AsString  := '1';
            Parambyname('p10').AsString := sbegin;
            //Parambyname('p11').AsString := sdetailid;
            Parambyname('p12').AsString := '品管部经理';
            Parambyname('p13').AsString := edit20.Text;
            Parambyname('p14').AsString := combobox2.Text;
            Parambyname('p15').AsString := ComboBox1.Text;
            if not RxCalcEdit1.Visible then
            begin
              Parambyname('p16').AsString := '0';
              Parambyname('p17').AsString := '';
            end
            else
            begin
              Parambyname('p16').value := RxCalcEdit1.Value;
              Parambyname('p17').AsString := Edit3.Text;
            end;
            Parambyname('p18').AsString := sgh;
            execsql;        //处理日志
            close;
            sql.Clear;
            sql.Add('insert into TRecord (operator, rq, dept, giveid, goodsno, things) values (:p1, :p2, :p3, :p4, :p5, :p6)');
            ParamByName('p1').AsString := mainfrm.StatusBar.Panels[7].Text;
            ParamByName('p2').AsString := sbegin;
            ParamByName('p3').AsString := mainfrm.StatusBar.Panels[5].Text;
            ParamByName('p4').AsString := sdj;//edit2.Text;
            ParamByName('p5').AsString := Query8.fieldbyname('goodsno').AsString;//edit4.Text;
            ParamByName('p6').AsString := '不合单流转结束,最终结果处理为:'+combobox1.Text+'!';
            execsql;
            close;
          end;
          loginfrm.Database1.Commit;
        except
           on e:exception do
           begin
             loginfrm.Database1.Rollback;
             showmessage(e.Message);
             exit;
           end;
        end;大部份时间是正常,但确实存在give 表的东西就是没有更改。其它确都提交了,不知道是什么原因?
      

  12.   

    首先你要去人table1,query是不是都时通过database1连接数据库的,如果不是 事物当然会出问题在其次 table1.append  table1.post的过程 是不是隐式事物? 非SQL提交数据可能自身就有事物处理其他的看不出问题 我估计你时没把table1的连接属性设置为 database1
      

  13.   

    全是database连接的。odbc数据源连的。没问题。table我只是举了个例子。我用的全 是Query. 奇怪,有没有可能在事务处理一半的时间,突然database连接服务器断开。比如网线拿掉,这样会不会回滚!