Delphi 2007 ZeosLib 6.6 Mysql 4.1来自其他客户端的事务锁表
情况是这样的。我有两个客户端程序,它们连接到服务器上的同一个mysql数据库。当我以以下方式在表上运行操作时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;
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