ドキュメント指向的銀行トランザクション
_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に向きます、だけの説明は聞いても絶対納得できないと思うのですよ。