7章トランザクション

2相コミットは、それがもたらすパフォーマンスや可用性の問題から、サポートするには負担が大きすぎると主張する人もいる。私たちは、トランザクションの欠如に対して常にアプリケーションプログラマがコードを書かなければならなくなるよりも、トランザクションの過剰な利用がボトルネックとなってくる場合に対処するようにした方が良いと信じています。

――James Corbett 他、“Spanner: Google's Globally-Distributed Database”(2012)

データシステムの過酷な現実の下では、多くの問題が生じうるものです。

  • データベースソフトウェアあるいはハードウェアは、いつ障害を起こすか分かりません(それは書き込みの最中に起こるかもしれません)。
  • アプリケーションはいつクラッシュするか分かりません(一連の操作の半ばでクラッシュするかもしれません)。
  • ネットワークの断絶によって、予期せずアプリケーションがデータベースから切り離されたり、あるデータベースノードが他のノードから切り離されたりするかもしれません。
  • 複数のクライアントが同時にデータベースに書き込み、お互いの変更を上書きしあうかもしれません。
  • クライアントが読み取ったデータが、部分的にしか更新されていないために意味を成さなくなっているかもしれません。
  • クライアント間のレース条件によって、驚くようなバグが引き起こされるかもしれません。

信頼性を保つためには、システムはこれらのフォールトに対処し、それらがシステム全体の破滅的な障害を引き起こさないようにしなければなりません。しかし、耐障害性の仕組みを実装するには多くの作業が必要になります。そのためには問題が起こりうるあらゆることについて大量の注意深い配慮と、その解決策が実際にうまくいくことを保証するための非常に多くのテストが必要になります。 ...

Get データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.