5

スクリプトの最初にデータベースに書き込む必要のあるphpページがあります。

スケジュールされたmysqldumpバックアップ中は、ロックされているテーブルに書き込もうとしているため、ページにアクセスできません。

ロック中、MySqlはそれらのSQL更新をキューに入れ、バックアップが完了した後、それらは必要に応じて実行されます。それでも、バックアップが完了するまで、私のphpページは表示されません。

ただし、更新によってスクリプトに何も返されないため、ロック中にスクリプトがハングアップしないようにしたいと思います。phpにsqlの更新をmysqlに送信するように指示し、更新が完了したことを確認する必要がないようにする方法があることを願っています。

phpがクエリをmysqlに送信し、更新が1秒以内に完了しない場合は、phpの次の行に進みます。

私はWindowsサーバーでphpを実行しているので、ある種のスレッド化はオプションではないことを理解しています。

そのクエリに(具体的には)タイムアウトを設定する方法がある場合、それは理想的かもしれませんが、タイムアウトになった場合にSQL更新を完全に更新したくありません。ロックが解除された後もMySQLに処理させたいです。

何をお勧めしますか(SQLの更新を完全に削除することはできません)?

4

3 に答える 3

3

1つの解決策は、PDOを使用して、タイムアウトで接続を開始し、トランザクションを開始し、ロックがある場合、タイムアウトによって接続が閉じられ、ロールバックされます。

PDOのタイムアウトには、PDO::ATTR_TIMEOUTを使用します。

于 2012-06-09T05:21:13.323 に答える
3

このスレッドに出くわす可能性のある他の人のために、私は最終的にこの関数を作成して、テーブルがロックされているかどうかを検出し、ロックされていない場合にのみSQL更新を実行します

function isLocked($databaseName,$tableName)
    {
        $sql = "show open tables from `".$databaseName."` where `table`=`".tableName."` and In_use > 0;";
        $result = @mysql_query($sql);
        if (mysql_num_rows($result) != 0 )
        {
            return true;
        }
        else
        {
            return false;
        }
    }

(注:この関数は、データベース接続がすでに確立されていることを前提としています)

これは機能します。これは、コードを変更して、ロックが設定されていない状態で次にページが読み込まれたときにSQLの更新が最終的に行われるようにしたためです。

于 2012-06-09T07:21:07.223 に答える
1

それを行う唯一の方法は、スクリプトを分割してajax呼び出しを使用することだと思います。すべてのスクリプトが結果に依存している場合は、大きな更新を送信して、そのプロセスに依存しない残りのスクリプトを続行できます。アップデートの中で、唯一の方法は素晴らしい読み込みを行うことです...

于 2012-06-09T05:21:39.090 に答える