学んだこと
- トランザクション制御を行うことでデータを守れる。(実用的な利益を感じるところまでは勉強できていない)
- beginTransaction でトランザクションを開始
- commit で更新を確定
- rollBack で失敗時にデータを元の形に戻す
##使用例
個人で作成したワーク内で使ってみました。
qiita.php
<?php
if (isset($_POST['submit']) === true) {
if ($kind !== '' && $price !== '') {
try {
$accessHouseholdData->pdo->beginTransaction();
$accessHouseholdData->insertKind($kind, $price, $userId);
} catch (Exception $e) {
$accessHouseholdData->pdo->rollBack();
}
$accessHouseholdData->pdo->commit();
}
}
試しに
qiita.php
<?php
if (isset($_POST['submit']) === true) {
if ($kind !== '' && $price !== '') {
try {
$accessHouseholdData->pdo->beginTransaction();
$accessHouseholdData->insertKind($kind, $price, $userId);
} catch (Exception $e) {
$accessHouseholdData->pdo->rollBack();
}
//$accessHouseholdData->pdo->commit();
}
}
このように記述すると、commitできていなくDBにinsertもされていないにも関わらず、更新をかけるまでは結果が出力されてしまう結果に。
どうやらもう一度送信ボタンを押さないとトランザクションが走らないため、とりあえず保留していたところからfetch(このコードの下にインサートしたデータを取って来る処理もあります)できてしまう模様。
##難しかったこと、メモなど
- 最初はどこにcommitとrollBackを記述すれば良いか分からなかった
- if文の中でも使えるよ
- とりあえず使い方はわかったものの、実際に複数のDB処理を行う場面で使ってみないと有用性は実感できないかな
- 意外とすんなり勉強できました
参考サイト
PHP公式 http://php.net/manual/ja/pdo.transactions.php
PHP公式 http://php.net/manual/ja/pdo.begintransaction.php
PHP + PDO + MySQL のトランザクション制御方法まとめ
PDOのトランザクション
##5/24 メモ
初心者なりの疑問→もしcommit
をtry
内に記述したら、エラーが発生後の記述のコミットを読んでからロールバックできるのか?
答え→biginTransaction
を行って以降エラーが発生したら、その時点でスローをしてくれて、それ以降の処理は読まないためcommit
はtry
の中でも大丈夫。