私は mysql とトランザクションに関する多くのドキュメントを読みましたが、理解したところによると、MySQL InnoDB で反復可能な読み取り分離レベルを使用し、トランザクションを開始すると、それらの行を選択すると、いくつかの行が追加されます。そのトランザクションで MySQL には表示されません。例えば:
function dotransaction() {
$result = mysqli_query("START TRANSACTION");
if (!$result) return false;
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (1,2)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (3,4)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("UPDATE t2 SET f3=(SELECT COUNT(*) AS count FROM t WHERE f1=1) WHERE f4=2");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
}
PHP で次のコードを実行すると、実際にはテーブル t2 のフィールド f3 が 1 に更新されます。しかし、トランザクションを開始すると、トランザクションはデータベースからスナップショットを読み取り、select ステートメントを使用する場合は常に、テーブルへの変更ではなく、最初に読み取ったスナップショットを使用するため、私はそれを期待していませんでした。UPDATE ステートメントから select ステートメントを取り出すと、count=1 にも達します。