Delphi 2007 ZeosLib 6.6 Mysql 4.1来自其他客户端的事务锁表

Delphi 2007 ZeosLib 6.6 Mysql 4.1来自其他客户端的事务锁表,mysql,delphi,transactions,locking,zeos,Mysql,Delphi,Transactions,Locking,Zeos,情况是这样的。我有两个客户端程序,它们连接到服务器上的同一个mysql数据库。当我以以下方式在表上运行操作时 ZCon.TransactIsolationlevel := tiSerializable; ZCon.AutoCommit := true; ZCon.StartTransaction; try ZQGeneral.Close; ZQGeneral.SQL.Clear;

情况是这样的。我有两个客户端程序,它们连接到服务器上的同一个mysql数据库。当我以以下方式在表上运行操作时

        ZCon.TransactIsolationlevel := tiSerializable;
        ZCon.AutoCommit := true;
        ZCon.StartTransaction;
        try
          ZQGeneral.Close;
          ZQGeneral.SQL.Clear;

          ZQGeneral.SQL.Add('UPDATE table1 SET field1 = 1 WHERE id = 2');
          ZQGeneral.ExecSQL;
          ZQGeneral.Close;


          ZCon.Commit;
          ZCon.TransactIsolationlevel := tinone;
          ZCon.AutoCommit := False;

        except
          ZCon.Rollback;
          ZCon.TransactIsolationlevel := tinone;
          ZCon.AutoCommit := False;
        end;
表1被阻止,在完成事务的客户端断开连接之前不会解锁。在第一次启动事务的客户机上,表也是可写的,但来自另一个客户机的表是只读的。 我给了msyql帐户所有的特权,以防出错,我还试图在事务操作后发送一个解锁表,但没有帮助。 我仔细检查了程序的源代码,以确保我没有忘记一些ZQuery打开,但没有任何顾忌。 为什么提交不解锁其他客户端的表1

我也试着用同样的行为来表现TireadCommitteed和Tiunadmocommited。
我还尝试将Zeos升级到7.2版,并将mysql改为5版,结果也一样。啊,我使用InnoDB。

我找到了一个解决方案。在连接到mysql之前,将autocommit设置为true,将TransactionLevel设置为tiserializable,并且在运行时不更改它,然后在需要时使用隐式starttransaction