ドキュメント指向的銀行トランザクション

_bulk_docsがでてきたのでついでに。データベーストランザクション、というと銀行の口座があるわけですが、

  • Aさん、Bさんの口座をロック
  • Aさんの口座残高 = Aさんの口座残高 - 10万円
  • Bさんの口座残高 = Bさんの口座残高 + 10万円
  • 全部実行できることを確認してコミット。

ってやつですね。この辺の話はgoogle://"口座"+"トランザクション" あたりで調べてもらえれば腐るほど出てくるのですが、 Aさんは「今からトランザクションするぜ!」といって、その上、Bさんの口座に振り込むために、Bさんの口座をロックするのです。なんと迷惑な!勝手に他人の口座をロックするなんて!と思わないのかなぁ。

CouchDBをはじめとしたドキュメント指向データベースでは次のようにすればいいでしょう。

  • Aさんは銀行宛に「Bさん宛振り込み10万円、Aより」とかいた紙を渡します

{
doc_type: "振り込み"
from: "A",
to: "B",
amount: 10
}

これを保存する。

以上です。身も蓋もないですが、これだけです。これでアプリケーションが作れてしまうところがドキュメント指向恐るべし、といったところです。
ロックをしなくていい理由?それは、Aさん、あるいは、Bさんから口座残高の問い合わせがあったときに、その都度、銀行員さんが書類の山をもってきて、1枚1枚の収支を"手分けして"計算してくれるんですよ。CouchDBの場合は、前回計算した書類の山は覚えているので、Aさん/Bさんが長生きしてもほとんどの場合大丈夫です。

CouchDBってどんなシステムに向いているの?というのはもっともな疑問なんだけれど、「銀行の口座はロックしてコミットしなければならない」という先入観がある以上は、XXに向きます、だけの説明は聞いても絶対納得できないと思うのですよ。