質問: 素人質問ですみません。 DBのトランザクション中に異常が起きたらロールバックしますよね。 でも、トランザクション中に異常が起きたということは、ロールバック時にも異常が起きる可能性が高いように思います。たとえばDBサーバが落ちているとか。 そうすると、ロールバックも失敗してしまいますので、あまりロールバックの有効性が高くないように思います。 少なくとも、アプリケーションレベルでのロールバックは、あったほうがいいけど、あっても変わらないレベルのものに思えてしまいます。 この考えに誤りがあったら(おそらくあると思いますが、)訂正をお願いできますでしょうか。 疑似コードになりますが、以下のようなコードを想定しています。 ``` db.startTransaction(); try { db.table1.insert('hoge'); db.table2.insert('fuga'); db.commit(); } catch(e) { db.rollback(); } ```
回答: > > トランザクション中に異常が起きたということは、ロールバック時にも異常が起きる可能性が高いように思います。 > > > 「DBサーバが落ちる」ような事例はさておき、「トランザクションに失敗するケース」のほとんどはサーバの動作異常ではなく、**デッドロック**や別進行のトランザクションから書き換えが入ったなど「書き込もうとしたデータが整合しない」ケースなので、サーバ動作に異常はなくロールバックできます。