InnoDBエンジンを備えたテーブル(tahminler、users)があり、InnoDBは行ロックを使用し、MVCC機能を備えていることを読みました。これら2つのことにより、同時書き込みクエリ(UPDATEまたはINSERT)がある場合でも、読み取りクエリ(SELECTクエリ)を実行できます)。
私の Web サイトには次のシナリオがあります。 1. user1 は、次のコードを使用して 2 つのテーブルに情報を挿入しています。
$id=$_POST['id'];
$user_id=$_POST['user_id'];
$tahmin=$_POST['tahmin'];
$tahmin_text=$_POST['tahmin_text'];
include_once("mysql.class.php");
include_once("config.php");
$db1;
$db1 = new db_mysql($conf['db_hostname'], $conf['db_username'], $conf['db_password'], $conf['db_name']);
$current_server_date = date('Y-m-d H:i:s');// Your local server time
date_default_timezone_set('Asia/Istanbul');
$current_pc_date = date('Y-m-d H:i:s');
$sql1 = $db1->query("INSERT INTO tahminler (tahmin, tahmin_text, match_id, user_id, timestamp)
VALUES ('$tahmin','$tahmin_text', $id, $user_id, '$current_pc_date')");
$sql1 = $db1->query("UPDATE `users`
SET daily_tahmin =(daily_tahmin+1), monthly_tahmin =(monthly_tahmin+1)
WHERE id=$user_id");
2. 同時に、別のユーザー user2 が前のテーブルの情報を要求しようとしています。
$sql1 = $db1->query("SELECT * FROM tahminler");
$sql1 = $db1->query("SELECT * FROM users");
user2 がデータベースからいくつかの情報を読み取るように要求すると、テーブルのエンジンが InnoDB であっても、データベースは user1 が書き込みクエリを完了するまで読み取り要求をブロックします。
上記のコードを変更し、いくつかの行を追加して、次のように Transactions feauter を使用して問題を解決しました。
$id=$_POST['id'];
$user_id=$_POST['user_id'];
$tahmin=$_POST['tahmin'];
$tahmin_text=$_POST['tahmin_text'];
include_once("mysql.class.php");
include_once("config.php");
$db1;
$db1 = new db_mysql($conf['db_hostname'], $conf['db_username'], $conf['db_password'], $conf['db_name']);
$db1->query("SET AUTOCOMMIT=0");//new
$db1->query("START TRANSACTION");//new
$current_server_date = date('Y-m-d H:i:s');// Your local server time
date_default_timezone_set('Asia/Istanbul');
$current_pc_date = date('Y-m-d H:i:s');
$sql1 = $db1->query("INSERT INTO tahminler (tahmin, tahmin_text, match_id, user_id, timestamp)
VALUES ('$tahmin','$tahmin_text', $id, $user_id, '$current_pc_date')");
$sql1 = $db1->query("UPDATE `users`
SET daily_tahmin =(daily_tahmin+1), monthly_tahmin =(monthly_tahmin+1)
WHERE id=$user_id");
$db1->query("COMMIT");//new
3 つの新しい行を追加して、トランザクション内で更新と挿入のクエリを実行し、他のテーブルとレコードの読み取りを可能にしますが、残念ながら、これらの行を追加した後でも読み取りブロックはそのままであるため、誰でもわかります不足しているクエリがある場合、またはここで間違いを犯した場合は私に連絡してください??