- ベストアンサー
try{}catch(){}の中にトランザクションスタートを入れる理由
- try{}catch(){}の中にトランザクションスタートを入れる理由について説明します。
- try{}catch(){}の中にトランザクションスタートを入れることで、例外が発生した場合にロールバックが行われ、トランザクション内の処理が全てキャンセルされます。
- このようにすることで、データベースの更新処理が一貫性を持って行われることが保証されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- t_ohta
- ベストアンサー率38% (5088/13306)
- retorofan
- ベストアンサー率33% (328/977)
- 五十嵐 皐月(@OK-WAVE_)
- ベストアンサー率48% (96/197)
関連するQ&A
- try~catch構文は、どういうメリットがあるのですか?
以下は 関数 hoge に失敗したら、例外を補足するコードです。 try { if (!hoge()) { throw new Exception('hogeに失敗しました'); } } catch (Exception $e) { echo $e; } 以下のように書いたほうが分かりやすいと思いますが、 駄目なんでしょうか? hoge() || die('hogeに失敗しました'); ちなみに、DBのトランザクションを利用して、何かに失敗したら、 catch 以下でロールバックするのは便利だと思います。 しかし、こういう場合以外で、try~catch構文を使うメリットは何でしょう?
- ベストアンサー
- PHP
- 継承クラスで定義したメソッドのtry-catch文
親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。
- ベストアンサー
- PHP
- Try-catch文(FileInputStream)
下記コードでエラーが出現して困っています。 fis.close();の部分でコンパイルエラー( 変数 fis は初期化されていない可能性があります。)の結果が返ってきます。 必ず通過するfinallyブロックにclose()処理を記述して、この処理もエラーが発生する可能性があるので、try-catchする必要があると教師が言っていました。 エラーが出現する原因はなぜでしょうか? 回答のほどよろしくお願い致します。 FileInputStream fis; try{ fis = new FileInputStream(fi.getAbsolutePath()); while( (b[i++] = fis.read()) != -1); }catch(FileNotFoundException e){ } catch(IOException e){ }finally{ try{ fis.close(); ←コンパイルエラー( 変数 fis は初期化されていない可能性があります。) }catch(IOException e){ } }
- ベストアンサー
- Java
- try~catch
php初心者です try~catchをわかりやすく教えてください throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか? try~catchを抜けたら、他の処理は普通に実行されるのでしょうか? try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?) try { throw new Exception('エラーが発生しました'); print "hoge"; } catch (Exception $e) { echo '例外発生', $e->getMessage(), "\n"; } print "foo"; よろしくお願いします
- ベストアンサー
- PHP
- C# トランザクション処理
DataSetのTableAdapterでSQL Serverへのデータ挿入、更新、削除を行います。 try { ta.UpdataQuery(.....); } catche { Exception; } といった処理をしますが、トランザクション処理をする場合、 try { // トランザクション開始 ta.UpdataQuery(.....); // コミット } catche { // ロールバック Exception; } といった感じになるかと思いますが、どのようにコードを書けばよいのでしょうか?手元にコードがありませんので詳細が書けませんが、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- try~catchについて
プログラム初心者です 繰り返し処理の中でtry~catchにスローしてもいいでしょうか?(正常にfor文は終了しますか?) try { for($a = 0; $a < 5; $a++) { if($a==3){ throw new Exception('3'); } } catch (Exception $e) { $msg = $e->getMessage(); } よろしくお願いします
- ベストアンサー
- PHP
- PHP+MySQLでrollback出来ない
PHP5 + MySQL5環境です。 以下のようなソースでロールバックさせたいのですが、 実行後、「phpMyAdmin」というDB操作ツールで対象テーブルを見てみると データが登録されてしまっています。(ロールバック出来ていない!?) どなたか原因がお解りでしたらご教授の程宜しくお願い致します。m(_ _)m ※ソースが見難いので、画像で見やすいものを添付します。 ※尚、catch句のデバッグは「bool(true) ロールバック実行」と返ってきます。 //***メイン処理ソース***************************** $sObj = new SQL_Controller(); $res = $sObj->tran_start(); if(!$res) exit; try{ //DB登録------------------ $res1 = $sObj->Customer_mst_Insert($_SESSION['CustomerInfo']); if(!$res1) throw new Exception("Customer_mst_Insert error"); throw new Exception("★rollbackテストの為、ここでワザとthrowしてみる★"); //コミット------------------ $sObj->tran_commit(); } catch(Exception $e) { //異常時はロールバックする-- $res = $sObj->tran_rollback(); var_dump($res); echo "ロールバック実行"; } //***↑メイン処理終わり。以下クラス。***************************** class SQL_Controller extends MySQL{ } class MySQL{ function query($sql){ //クエリ実行 return mysql_query($sql); } function tran_start(){ //■トランザクション開始------ try{ $res = $this->query("set autocommit = 0"); if(!$res) throw new Exception(); $res = $this->query("begin"); if(!$res) throw new Exception(); } catch(Exception $e) { return false; } return true; } function tran_commit(){ //■コミット------ return $this->query("commit"); } function tran_rollback(){ //■ロールバック------ return $this->query("rollback"); } }
- ベストアンサー
- PHP
- オフライン中のトランザクションについて
表領域をオフラインにした場合、オフライン前に開始されたトランザクションは有効ですが、オフラインのまま、コミット、または、ロールバックして、表領域をオンラインにしても、整合がとれるのはなぜなのでしょうか。 コミットするか、ロールバックするかの情報はどこに保持してるのか疑問です。 (オフラインにしてから、ファイルをリネームし、 トランザクションをロールバックして、 ログをアーカイブし、DB再起動後に、ファイル名を戻して、 オンラインにすると、ちゃんとロールバックされています。 同じ操作で、コミットするとちゃんとコミットされています。 知っている方には当然なのでしょうが、私にとっては、不思議です) 詳しい方がみえましたらご教授お願いいたします。
- ベストアンサー
- Oracle
- カーソルがコミットするとクローズされてしまう。
オラクルのDBで環境はUNIX(IBMのマシン)です。 DBについて詳しくありませんが、以下のようなことを行いたいと考えています。 1.あるDB(DB-A)のレコードを特定のキーの昇順に全レコード読み込む。(特定のキーは、例えば商品コードなど) 2.1レコードを読み込む毎に、他のDB(DB-B)を読み込んだレコードを元に、更新したい。 その際、1レコードを読み込む都度、 2-1.トランザクションの開始 2-2.DB-Bの更新 2-3.コミット又はロールバック のようにしたい。 上記のことを考えて以下のような作りにしました。 1.カーソルのオープン 2.以下のループを作成 2-1.DB-Aから1レコードのフェッチ 2-2.トランザクションの開始 2-3.DB-Bの更新 2-4.コミット(ロールバック) しかしながら、コミット(又はロールバック)を行うことにより、カーソルがクローズされてしまい、最初の位置にカーソルが戻ってしまいます。(私がコーディングして試験したわけではありません。このような報告をうけました) それで、カーソルが戻らずに、全レコードを処理するようにしたいのですが、どのようにしたら良いのでしょうか。ご存じの方おりましたらアドバイスをお願いします。
- ベストアンサー
- その他(データベース)
お礼
ご回答ありがとうございます。 >トランザクションスタートしてないのにロールバックするとエラーになる言語があるので なるほど、言われてみると(エラーは厳しいですね)警告位は出てもおかしくなさそうな気がします。 何となく中に入れて書くものと思ってしまっているのが良くなかったのかもしれません。 ちゃんと意味を考えてtry{}catch(){}書く様にしたいと思います。