PHP Documentationは言う:原子性、一貫性、独立性および耐久性(ACID):理解PDOのMySQLの取引
あなたが前のトランザクションが発生したことがない場合、彼らは4つの主要な 機能を提供します。それはコミット があるとき 素人の面では、すべての作業が、それは段階的に行わ であっても、トランザクション内で行われ、と、他の接続からの干渉を受けることなく、安全にデータベース に適用されることが保証されています。
質問:これは、私は彼らがお互いに干渉することなく同時にトランザクションを実行している2つの別々のPHPスクリプトを持つことができること
を意味するのでしょうか?
私は何を意味ON起草 "妨害" :
想像我々持って次employees
表:
__________________________
| id | name | salary |
|------+--------+----------|
| 1 | ana | 10000 |
|------+--------+----------|
私は似て2つのスクリプトを使用している場合/同じコードであり、正確に同じ時刻に実行されます。
script1.phpとscript2.php(両方が同じコードを有する)次のよう
$conn->beginTransaction();
$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary
$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);
$conn->commit();
及びイベントのシーケンスを仮定である:
script1.phpデータを選択する
script2.phpデータ
script1.php更新データ
script2.php更新データ
script1.php(コミット)
script2.php起こる選択コミット()が発生する
この結果、アナの給与はどのようになるでしょうか?
11000ですか?これは、コミットが発生する前に情報が取得されたため、1つのトランザクションが他のトランザクションと重複することを意味しますか?
12000ですか?そして、これは、データが更新されて選択された順番にかかわらず、
commit()
機能がこれらを個別に実行するように強制したことを意味しますか?
あなたが取引して別々のスクリプトが互いに干渉することができます(または干渉しないように)どのように好きなだけを詳しく説明すること自由に感じなさい。
を私はかなり確信していますこれらのスクリプトの1つに対して、 'SQLSTATE [23000]:Integrity constraint violation'エラーがポップアップします。問題は、両方がまったく同じ時刻に実行されているかどうかです。 – icecub