2016-09-17 5 views
0

状況はこれです。私は、サーバー上の同じmysqlデータベースに接続する2つのクライアントプログラムを持っています。私はテーブルの1以下の方法Delphi 2007 ZeosLib 6.6 Mysql 4.1他のクライアントからのトランザクションロックテーブル

 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; 

のテーブルで操作を実行するとブロックされ、トランザクションを完了したクライアントの接続が切断されるまで、ロックを解除しません。最初にトランザクションを開始したクライアントでは、テーブルも書き込み可能ですが、他のクライアントからは読み取り専用です。 私はmsyqlアカウントに間違いなくすべての特権を与えました、私はまた、トランザクション操作の後にUNLOCKテーブルを送信しようとしましたが、それは助けにはなりませんでした。 プログラムのソースを再確認して、開いているZQueryを忘れていないことを確認しました。 他のクライアント用にtable1のロックを解除しないのはなぜですか?

また、同じ動作でtiReadCommitedとtiUnreadCommitedを試しました。 また、Zeosをバージョン7.2にアップグレードしようとしましたが、同じ結果でバージョン5のmysqlを変更しました。ああ、私はInnoDBを使っています。

答えて

0

解決策が見つかりました。 mysqlに接続する前に自動コミットをtrueに設定し、実行時にトランザクションを変更しないで、必要に応じて暗黙の開始トランザクションを使用します。

関連する問題