- ベストアンサー
MySQLとPHPのトランザクションについて
MySQLとPHPのトランザクションを利用して不整合対策を行う場合、下記のような例になるかと思いますが、 $dbh->beginTransaction(); try { }catch(PDOException $e){ $dbh->rollback(); } try { }catchの中で、PHP側での演算の判定を入れて、エラーの場合、ロールバックをさせるような使用方法は可能でしょうか? 例えば、 1.SELECTで現在の上限数を取得 2.PHPで上限数と比較 3.上限数を超えていない場合は、INSERTを流す 4.上限数を超えている場合は、エラーでロールバック のように、上限数が決まっている処理において、 2と3の処理の際に起こり得る不整合をなくしたいと考えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>try { }catchの中で、PHP側での演算の判定を入れて、エラーの場合、ロールバックをさせるような使用方法は可能でしょうか? 元々MySQL自体が、 BEGIN~COMMIT~ROLLBACK をサポートしてるので、可能です。 https://dev.mysql.com/doc/refman/5.6/ja/commit.html 今回は、触れてませんが、このやり方Lalavelとかだと ごく普通に使われているので、可能というよりすでによく 使われてる手法ですね。 という事で回答としては、ごく普通の手法で問題はない!。 となります。 おまけ MySQLのIF構文で、条件通過後をサブクエリでそのINSERTを やると、INSERTできた場合とできなかった場合で、 追加時点でのAI値がまともに得られませんが、 上に書いてる条件だけを満たすものを1発で書くことも可能では あります。 (ただし、他の人が見てもう~理解できないクエリになってくるのだが) https://dev.mysql.com/doc/refman/5.6/ja/if.html ただ、INSERT条件を満たすか?ってタイミングだけは しっかり守られるので、これはこれであり!って ケースなら、そういう手法もありますよ。
お礼
ありがとうございます!!