1

情况是这样的。我有两个客户端程序连接到服务器上的同一个 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 帐户所有的权限没有记错,我也尝试在事务操作后发送一个 UNLOCK 表,但它没有帮助。我仔细检查了程序的源代码,以确保我没有忘记打开一些 ZQuery,但没有任何顾忌。为什么提交不为其他客户端解锁 table1?

我还以相同的行为尝试了 tiReadCommited 和 tiUnreadCommited。我还尝试将 Zeos 升级到 7.2 版并将 mysql 更改为 5 版,结果相同。啊,我使用 InnoDB。

4

1 回答 1

1

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

于 2016-10-11T07:32:46.243 回答