PHP
PDO
初心者
Transaction

超初心者が学ぶtransaction

More than 1 year has passed since last update.


学んだこと 


  • トランザクション制御を行うことでデータを守れる。(実用的な利益を感じるところまでは勉強できていない)

  • 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 メモ

初心者なりの疑問→もしcommittry内に記述したら、エラーが発生後の記述のコミットを読んでからロールバックできるのか?

答え→biginTransactionを行って以降エラーが発生したら、その時点でスローをしてくれて、それ以降の処理は読まないためcommittryの中でも大丈夫。