業務中に分散トランザクションにハマって色々調べたので学んだ事を纏めます。
#1.分散トランザクションとは
###1.1.トランザクションとは
まず初めにトランザクションの定義について記述します。
トランザクションとはアプリケーションがデータベースに対してinsert、update、deleteなどの処理を実行した際の処理のグループで、コミット、もしくはロールバックが実行されるまで続きます。
1つのトランザクションに含まれる処理は1つでもいいし複数あっても大丈夫です。
しかし、トランザクション内の処理が1つでも失敗した場合はデータが不完全な状態なので処理を開始する前に戻したいということは多いと思います。
例えば、商品が売れた際に売り上げ管理テーブルに数値を足してと在庫管理テーブルから在庫を減らす処理をするアプリケーションの場合、
売り上げ管理テーブルへの更新は成功したが、在庫管理テーブルへの更新は失敗した場合、商品は売れているのに在庫は減っていないという状態になります。
これはおかしいので一旦売り上げ管理テーブルも更新する前に戻す必要があります。
この時に処理のグループ(=トランザクション)を売り上げ管理テーブルと在庫管理テーブルの更新に設定しておけば二つが成功してようやくコミット。片方でも失敗すればロールバックする。
という動作ができるようになります。
1言で纏めると(文中でも書きましたが)トランザクションとは処理のグループの事です。
グループにいくつの処理を入れるかはアプリケーションで設定できます。
###1.2.分散トランザクションとは
ではいよいよ分散トランザクションとはどういうものなのかという話になります。
分散トランザクションとは、先ほどの売り上げ管理テーブルと在庫管理テーブルの例で言うと下図のようなDB構成の場合に発生するものです。
図を見れば違いがわかると思いますが、売り上げ管理テーブルと在庫管理テーブルが別のDBに属しています。
つまり、トランザクションが成功するにはデータベース1の売り上げ管理テーブルの更新に成功し、かつデータベース2の在庫管理テーブルの更新にも成功する必要があります。
どちらか1つでも失敗してしまえば売り上げと在庫の計算が合わなくなるので両方をロールバックする必要があります。
データベースが2つになっただけで実際の動きとしてはもとのトランザクションと同じと考えていいでしょう。