Delphi 2007 ZeosLib 6.6 Mysql 4.1 来自其他客户端的事务锁 table
Delphi 2007 ZeosLib 6.6 Mysql 4.1 Transaction lock table from other client
情况是这样的。我有两个客户端程序连接到服务器上的同一个 mysql 数据库。当我 运行 按以下方式对 table 进行操作时
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;
table1 被阻塞,直到客户端断开连接完成交易后才会解锁。在首先启动事务的客户端上,table 也是可写的,但在另一个客户端上是只读的。
我给了msyql帐户所有权限没有记错,我也尝试在交易操作后发送UNLOCK tables但它没有帮助。
我仔细检查了程序的源代码以确保我没有忘记一些 ZQuery 打开但没有任何顾忌。
为什么提交不为其他客户端解锁 table1?
我还尝试了具有相同行为的 tiReadCommited 和 tiUnreadCommited。
我还尝试将 Zeos 升级到版本 7.2 并将 mysql 更改为版本 5,结果相同。啊,我用的是InnoDB
我找到了解决方案。在连接到 mysql 之前将 autocommit 设置为 true 并将 transactisoltionlevel 设置为 tiserializable 并且在运行时不更改它,然后在需要时使用隐式 starttransaction。
情况是这样的。我有两个客户端程序连接到服务器上的同一个 mysql 数据库。当我 运行 按以下方式对 table 进行操作时
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;
table1 被阻塞,直到客户端断开连接完成交易后才会解锁。在首先启动事务的客户端上,table 也是可写的,但在另一个客户端上是只读的。 我给了msyql帐户所有权限没有记错,我也尝试在交易操作后发送UNLOCK tables但它没有帮助。 我仔细检查了程序的源代码以确保我没有忘记一些 ZQuery 打开但没有任何顾忌。 为什么提交不为其他客户端解锁 table1?
我还尝试了具有相同行为的 tiReadCommited 和 tiUnreadCommited。 我还尝试将 Zeos 升级到版本 7.2 并将 mysql 更改为版本 5,结果相同。啊,我用的是InnoDB
我找到了解决方案。在连接到 mysql 之前将 autocommit 设置为 true 并将 transactisoltionlevel 设置为 tiserializable 并且在运行时不更改它,然后在需要时使用隐式 starttransaction。