index.php
~~~~~~~~
//Update構文にて、お金の受け渡しを想定したケース
try{
$cone->beginTransaction;
$psn->execute([
:name => $A_user, //佐藤さん(剛田さんへお金渡す人)
:money => -1 * $money //-2000円の値が入ってます。
]);
$psn->execute ([
:name => $B_user, //剛田さん(佐藤さんからお金受け取る人)
:money => $money //2000円の値が入っています。
]);
$cone->commit();
}catch(PDOExcetion $e){
echo $e->getMessage();
$cone->rollback();
}
説明
①今回のケースでは、「佐藤さん」は「剛田さん」にお金を2000円振り込むケースです。
②トランザクションを用いずこのケースを処理しようとした場合
A.正常に問題なく処理が行われる。
B.佐藤さんの処理は正常に行われたが、剛田さんの処理はエラーとなり、佐藤さんの口座から-2000円となっていて整合性が保てなくなる。
C.剛田さんの処理は正常に行われたが、佐藤さんの処理はエラーとなり、剛田さんの口座が何故か+2000円となって整合性が保てなくなる。
③ ②のケースを解消する方法がトランザクションです。
try catchで処理を囲み、正常に処理が進んだ場合、最後まで(commit)処理が実行されDBは更新されます。
但し、途中で処理が中止(エラー)となった場合、catch処理内の処理が走り、処理が全消し(rollback)となります。
トランザクション以降に記載されたプログラムは、commitされるまで確定されません。(オートコミットオフになる)
いやー、面白い!