2

MySQLDBとinnoDBテーブルがあります。接続し、テーブルをロックし、いくつかの更新を行ってから、テーブルのロックを解除するphpページがあります。PHPページは、Wampを介してApacheで提供されています。

phpページはファイルをデータベースにアップロードします。PHPに割り当てられているメモリよりも大きいサイズのファイルをアップロードして、システムのクラッシュをシミュレートすることにしました。これは間違いなくこのエラーを引き起こしました:18874368バイトの許可されたメモリサイズが使い果たされました(6176754バイトを割り当てようとしました)。その後、更新中にロックされていたテーブルは引き続きロックされます。

このエラーの後にテーブルにアクセスしようとすると、次のエラーが発生します。テーブル'a'はLOCKTABLESでロックされていません。SQLプロンプトを表示して、ロックされたテーブルから選択しようとするため、ロックの問題であることがわかっています。テーブルがロックされている場合とまったく同じように、待機します。その後、Apacheプロセスを強制終了すると、SQLプロンプトで実行しようとしたステートメントが最終的に実行されます。私の推測では、Apacheプロセスを強制終了すると、MySQLは、接続が切断されたためにテーブルロックを解放する必要があることを認識します。

何か案は??

4

3 に答える 3

6

Qouteから:http ://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

クライアントセッションの接続が正常または異常に終了すると、サーバーはセッションによって保持されているすべてのテーブルロック(トランザクションおよび非トランザクション)を暗黙的に解放します。クライアントが再接続すると、ロックは無効になります。さらに、クライアントにアクティブなトランザクションがある場合、サーバーは切断時にトランザクションをロールバックし、再接続が発生すると、新しいセッションは自動コミットを有効にして開始します。

ページが実行され、完了/破棄された後も接続は永続的であるため、接続は引き続き存在します。

接続を永続的なIMOにしないでください

于 2011-03-02T13:09:43.340 に答える
3

さて、私の投稿を読んだ後、私は自分の質問に答えたようなものだと気づきました。mysql_pconnect()を使用してデータベースに接続していたため、クラッシュしても接続は維持されていました。mysql_connect()に変更しましたが、問題なく動作しました。誰かの時間を無駄にしてすみませんが、これが誰かの助けになることを願っています!!

-ジョシュア

于 2011-03-02T13:05:54.353 に答える
0

シャットダウン機能を使用して、テーブルのロックを解除できます。

http://php.net/manual/en/function.register-shutdown-function.php

于 2011-03-02T13:06:05.113 に答える