- ベストアンサー
try{}catch(){}の中にトランザクションスタートを入れる理由
- try{}catch(){}の中にトランザクションスタートを入れる理由について説明します。
- try{}catch(){}の中にトランザクションスタートを入れることで、例外が発生した場合にロールバックが行われ、トランザクション内の処理が全てキャンセルされます。
- このようにすることで、データベースの更新処理が一貫性を持って行われることが保証されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なぜ中なのかは私も説明できません。 そのためか、私は外に書く派です。 トランザクションスタートに失敗した場合はロールバックする必要がないからです。 トランザクションスタートしてないのにロールバックするとエラーになる言語があるのでそのせいかも。 もしトランザクションスタートで例外キャッチするとしたら、こんな書き方をしたくなります。 try{ トランザクションスタート try{ 処理 コミット }catch(Exception e){ ロールバック } }catch(Exception e){ }
その他の回答 (3)
- t_ohta
- ベストアンサー率38% (5238/13705)
トランザクションスタートは宣言をしているだけでRDBMSからエラーが返ってこない場合(返ってこないRDBMS)があるので入れない人が居るのかもしれませんね。 トランザクションスタートがエラーになるのはDBへのコネクションが確立できてない場合でしょうから、そのエラーはDB接続処理のところでキャッチしていると言う前提で処理しているのでしょうね。 tryの中に入れてもいいですか、トランザクションスタートのエラーをキャッチした場合はロールバックしてもロールバックもエラーになるはずです。 トランザクションスタートがエラーになったらDBへの再接続処理をするとか、システム全体の動作に影響する可能性があるので別のエラー画面を出すと言った配慮が必要だと思います。
お礼
ご回答ありがとうございます。 >トランザクションスタートがエラーになるのはDBへのコネクションが確立できてない場合でしょうから、 あれ?トランザクション使い切った場合、トランザクションスタートはエラーになりますが DBコネクションも行えなくなりましたっけ? DBコネクションをしてSelectは行えたと思いますが私の勘違いかな? >トランザクションスタートのエラーをキャッチした場合はロールバックしてもロールバックもエラーになるはずです。 トランザクションスタート時 DBのトランザクションスタートは動いているのにExceptionが発生する事は無いのでしょうか?
- retorofan
- ベストアンサー率34% (435/1276)
エラーハンドリングの 「try…catch”構文」だから。 その中に入れなくては、 「エラーハンドリングにならないでしょう?」って話。
お礼
ご回答ありがとうございます。 >「エラーハンドリングにならないでしょう?」って話。 私もそう思いますが。 おそらくそれを言ったら全ての処理にtry{}catch{}を入れるべきと言われるのが予想されます。
- 五十嵐 皐月(@OK-WAVE_)
- ベストアンサー率48% (96/197)
こんにちは😊💫 なぜトランザクションスタートをtryブロックの中に入れるべきか、についてご質問いただきましたね!😄🌟🎉 まず、トランザクションスタートをtryブロックの中に入れる理由は、トランザクション開始時にもエラーが発生する可能性があるからです🌀🤔 tryブロック内でトランザクションスタートを行うと、もしトランザクション開始時にエラーが発生した場合、catchブロックに処理が移ります🌠👌 そのため、トランザクションスタートに問題が発生した際に、適切な例外処理が行われるのです😊🌈 それに対して、トランザクションスタートをtryブロックの外に置く場合、もしトランザクション開始時にエラーが発生しても、catchブロックに処理が移らず、適切な例外処理が行われない可能性があります💦😰 この理由から、トランザクションスタートはtryブロックの中に入れることが推奨されています✨😃👍 この回答が解決の一助となれば幸いです😊💕
補足
ご回答ありがとうございます。 DBが動いていなかったりトランザクション数のオーバー等にて エラーが発生した際にcatchされないのは分かるのですが もしかして トランザクションを掴むだけ掴んでエラーが発生する事があるのでしょうか?
お礼
ご回答ありがとうございます。 >トランザクションスタートしてないのにロールバックするとエラーになる言語があるので なるほど、言われてみると(エラーは厳しいですね)警告位は出てもおかしくなさそうな気がします。 何となく中に入れて書くものと思ってしまっているのが良くなかったのかもしれません。 ちゃんと意味を考えてtry{}catch(){}書く様にしたいと思います。