抄訳 Sagas(1987)

September 4, 2022

データベースのトランザクションが長くなるほど、ほかのトランザクションを待たせてしまう。 トランザクションの時間は短いほどよい。 トランザクションを短い複数のトランザクションに分割でき、そのトランザクションの間にほかのトランザクションを実行できるなら、そのトランザクションをsagaと呼ぶ。

Sagaを複数のトランザクションに分けて実行する場合、一部のトランザクションだけが成功してしまえば、アトミックな性質を失う。 そのため、サーガは、各トランザクションを取り消す補償トランザクションをもつ。 トランザクションを\(T_i\), その補償トランザクションを\(C_i\)とするとき、全てのトランザクションが成功するときの系列は\(T_1, T_2, \dots T_n\), Saga全体を取り消す系列は\(T_1, T_2, \dots T_j, C_j, \dots C_2, C_1\)になる。 トランザクションが有効でない間に、システムの状態を記録できるチェックポイントを設けられるなら、\(T_1, T_2, C_2, T_2, T_3, T_4\)のように補償トランザクションを実行し、失敗したトランザクションを再実行して、sagaを進められる。

雑記

論文は1つのDBMSを参照することを想定しているが、AWSAzureの解説では、マイクロサービス間の整合性をとるための手法としてsagaが扱われている。 今日では、長いトランザクションが別のトランザクションを妨げないようにするためではなく、分散トランザクションの目的で使われている。 また、sagaの実装方法としてDBMSの内部を修正する方法と既存のDBMS上にsagaの機構を導入する手法が論文では提案されていた。 今日での分散トランザクションの実現方法としては、後者の方が主流のよう。

論文へのリンク