2

次のコードを使用して、非 autocommin 接続にいくつかのレコードを投稿します。

ZConnection1.AutoCommit := False;

  try
    ZTable1.Insert;
    ZTable1.FieldByName('name').AsString := 'John Doe';
    ZTable1.Post;
    ZConnection1.Commit;
  except
    ZConnection1.Rollback;
  end;

このコードを実行すると、データベースには何も保存されません。

次のコードを試した後...

ZConnection1.AutoCommit := False;

   with ZQuery1 do begin
      SQL.Text := 'INSERT INTO mytable (name) values ("John Doe")';
      ExecSQL;
      SQL.Text := SQL.Text + 'COMMIT' ;
      try
        ExecSQL;
      except
        SQL.Text := 'ROLLBACK';
        ExecSQL;
      end;
    end;

...すべて完璧に機能します。

最初のケースで何が間違っていますか? Delphi6、MySql、Zeos ライブラリ、InnoDB テーブルを使用しています。

4

1 に答える 1

7

私の問題を修正しました:

AutoCommitZeos でプロパティが実際に機能する方法は次のとおりです。

  • whenAutoCommitが True の場合、SQL ステートメントが実行されるたびにトランザクションが自動的にコミットされますが、StartTransactionを明示的に呼び出すまでは、コマンドを明示的に使用してこの自動コミットを防ぐことができますCommit
  • AutoCommitが False の場合、 を呼び出すべきではありませんStartTransaction。その後、トランザクションは自動的に開始されますが、ステートメントが実行されるたびに自動的にコミットされるわけではありません。

ZConnection1.AutoCommit := True;
ZConnection1.StartTransaction;
try
  ZTable1.Insert;
  ZTable1.FieldByName('name').AsString := 'John Doe';
  ZTable1.Post;
  ZConnection1.Commit;
except
  ZConnection1.Rollback;
end;
于 2013-03-15T11:14:57.137 に答える