将database1.StartTransaction;放在对数据库处理开始处;

解决方案 »

  1.   

    query1.first;  //转到首记录database1.StartTransaction;while not query1.eof do 
    begin
       query1.edit;  //编辑QRY1
       ...
      query1.post;  //把它提交到自己本机的内存,但未真正保存到数据库。
      //--
      query2.edit;
      ....
      query2.post;
      //--
      query3.insert;
      ...
      query3.post;
      query1.next;
    end;//做完循环语句,然后开始做提交
      try
        query1.ApplyUpdates;
        query2.ApplyUpdates;
        query3.ApplyUpdates;
        database1.Commit;
      except
         database1.Rollback;
         showmessage('事务出错');
      end;
     query1.CommitUpdates;
     query2.CommitUpdates;
     query3.CommitUpdates
      

  2.   

    事物回滚starttransaction,commit要成对才能实现事物回滚
    因为你没在开头写starttransaction所以就直接修改表了
    query1.first;  //转到首记录database1.StartTransaction;while not query1.eof do 
    begin
       query1.edit;  //编辑QRY1
       ...
      query1.post;  //把它提交到自己本机的内存,但未真正保存到数据库。
      //--
      query2.edit;
      ....
      query2.post;
      //--
      query3.insert;
      ...
      query3.post;
      query1.next;
    end;//做完循环语句,然后开始做提交
      try
        query1.ApplyUpdates;
        query2.ApplyUpdates;
        query3.ApplyUpdates;
        database1.Commit;
      except
         database1.Rollback;
         showmessage('事务出错');
      end;
     query1.CommitUpdates;
     query2.CommitUpdates;
     query3.CommitUpdates
      

  3.   

    一开始写在query的缓冲里,提交前database1.StartTransaction; 难道不是开始对数据库的实际事务么??