skillup

技術ブログ

プログラミング全般

トランザクション、ロールバックに関する考察

投稿日:

今までトランザクションの単位は基本的に処理の開始から終了までを範囲にすることが多かったのですが(ループがある場合はループ全体ではなく、1ループをトランザクションとみなします)、複数の処理が絡む場合、不都合が起きることがあります。

個人的にトランザクションを分けるときなどでポイントとなる点を。

失敗した場合に本当に最初からロールバックすべきか?

要は失敗した場合に、「失敗した処理」として明記するような場合、その処理自体はコミットする必要があります。

ではなく、

のようにする必要があります。

要は処理1と処理2は連続しているけれどもコミットの単位としては分割したいときなどですね。

仕様やそもそもユーザーがどのように使うかという問題になってきます。

処理1は完結しているので、次は処理2からはじめたい時(始めるのが可能な時)は処理を分ける必要があります。

あるいは単純に1処理が長すぎる場合なども適切に分けたほうが良いでしょう。

成否が確認できない、または影響が少ない

例えば完了した後、メールやプッシュ通知などを送ったことの成否の確認をしてコミットするか否かですが、そもそもこれらのサービスの成否というのは完全にはわかりません。(送信成功と出たところでユーザーに完全にメールや通知が届くかは保証できない)

そのため、コミットの外におく必要がある場合もあるでしょう。

またはこけたとしてもロールバックまでには値しない処理(ログ的なデータの書き込みなど)はトランザクションの範囲外にしたり、処理結果によるロールバックを行わないということもあるでしょう。(前回のエラーのブログのExceptionを握りつぶす時に似てます。)

ロールバックできない処理の考慮があるか

またトランザクション内では処理順番なども大切です。

例えばAPIでの登録→DBの登録とすると、DBでこけた場合、APIの処理の取り消ししなければいけなくなります(API側に取り消しする機能がない場合、宙ぶらりんのデータができてしまいます。)。

そのため、このようなロールバックが難しい処理の場合は、DBの登録→API更新などとすると処理が確定させるかどうかをAPI更新の成否で判断することができるため、APIがこけたときにDB側のロールバックをすることができます。このため整合性のあるデータ登録をすることができます。

-プログラミング全般
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

ユーザーに見せるエラーメッセージに関する考察

プログラムで難しいことの3つは テスト ログ エラーハンドリング とかいてきましたが、ユーザー側に見せるエラーメッセージについて考察して見ました。 Contents1 ログとエラーメッセージの違い2 …

no image

メモリに関して 静的領域、スタック、ヒープなど

実務でメモリの調査をしましたが、肝心のメモリについてほとんどわかっていないのでメモ。 メモリの領域を大きく分けると静的、スタック、ヒープに別れる。 Contents1 静的2 スタック3 ヒープ4 そ …

no image

例外処理に関して

いまいち使い方がいい加減だった例外処理について、復習がてらメモします。 昔のリンクを整理して出てきた例外リンクはこちら(Javaですが今のPHPにも当てはまるかと思います。) 例外処理について 例外処 …

no image

浮動小数点に関して

金額計算なんかでfloatを使うと誤差が出るっていうのは基礎的な話ではありますが、背景知識を含めて理解しておこうと思ったのでメモります。 Contents1 float,doubleでの誤差2 金額の …

no image

Eclipseのシンタックスハイライト

先日PCがクラッシュした時にEclipseを入れなおしたんですが、普段あまり意識せずに使っていたのでhtmlのシンタックスハイライトをだすためだけに2時間ぐらい費やしました・・・自戒の意味も込めてメモ …

アーカイブ