2

我使用下一个代码在非自动通信连接上发布一些记录:

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 中属性的实际工作方式:

  • AutoCommit为 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 回答