2017-01-26 6 views
1

PHPのmysqli-> query()とfetch_row/fetch_assocをループで使用すると、PHPはデータを最初にキャッシュし、結果を全体として返します(したがって、その間に行が更新されると、fetch_row古いデータを返しますか?それともリアルタイムデータを返しますか?PHP mysqli queryとfetch_(row/assoc)はリアルタイムデータを使用していますか?

PHPのキャッシュを使用するかどうかを制御できるように、この動作を設定できる場所はありますか(データベースタイプの設定、PHPの設定...など) 。

ファイル1:

願望などのデータやリアルタイムデータは

たとえば、私たちは同じDBテーブル「ユーザー」を変更する2つのプロセスを持っています

<?php 
$res=$mysqli->query("SELECT * FROM users WHERE id > 0 and id < 100 ORDER BY id ASC"); 
while($r=$res->fetch_assoc()){ 
    ...do something that takes 10 mins each loop... 
    print_r($r['active']); 
} 

はファイル2:

$mysqli->query("UPDATE users SET `active` = 'TRUE' where id = 90"); 

レッツは、最初はすべてのユーザーがFALSEにactiveセットを持っていると言います。 ファイル1を1つの端末で実行し、その直後に別の端末でファイル2を実行します。

ファイル1がユーザー "90"を処理するとき、 "TRUE"または "FALSE"が出力されますか?

ありがとうございます。

+2

これはPHPについてではなく、データベースに関するものです。通常の種類のリレーショナルデータベースはクエリを実行し、一貫性のある結果を一度に返します。結果を読むことは重要ではありませんが、それらはただそこにあります。クエリの実行中または結果の変更後に行う操作はありません。他の種類のデータベースでも同じことは当てはまりません。 –

答えて

2
$res=$mysqli->query("SELECT * FROM users WHERE id > 0 and id < 100 ORDER BY id ASC"); 

あなたのクエリは、そのステップにのみを実行しました。それ以降のデータにアクセスする方法では、PHPがレコードを再度照会することはありません。実行しているループは、クエリによって返されたすべてのデータを保持するPHP内部変数にあります。ループ中にMySQL Serverとの通信はありません。

クエリが実行され、表示される前にレコードが変更されると、古いデータが表示されます。リアルタイムではありません。

この期間に他のプロセスによって更新された可能性のある最新のデータを取得するには、もう一度クエリを実行する必要があります。

ファイル1がユーザー "90"を処理するとき、 "TRUE"または "FALSE"が出力されますか?

FALSE

ので、あなたはそれがFALSEに設定したデータベースを照会し、あなたが再び照会しない限り、現在の値が何であるかは重要ではありませんとき。

+2

ループ中にデータベースとの通信があるかどうかは、クエリがバッファされているかどうかと、データがデータベースからフェッチされた時間によって異なります。しかし、それは本当に無関係の詳細です。データベース自体は、クエリの[ACID](https://en.wikipedia.org/wiki/ACID)プロパティと、返されるデータの一貫性(how)(一貫性)を処理します。 – deceze

+0

投稿には、OPがクエリバッファリングやACIDに精通していないことを示すかなりの指標があります。その理由は、それらのトピックを残しました。 –

+0

敷物の下にACIDを掃除することはあまり教育的ではないようです。 :-P – deceze

関連する問題