一般的な応答として、MongoDBでのマルチドキュメントコミットは、2フェーズコミットとして実行できます。これは、マニュアルである程度詳細に文書化されています(http://docs.mongodb.org/manual/tutorial/perform-two-phase-を参照)。 commits /)。
マニュアルで提案されているパターンは、簡単に次のとおりです。
- 個別の
transactions
を設定します ターゲットドキュメントを含むコレクション 、ソースドキュメント 、値 および状態 (トランザクションの) -
initial
を使用して新しいトランザクションオブジェクトを作成しますstate
として - トランザクションの作成を開始し、
state
を更新しますpending
へ - トランザクションを両方のドキュメント(ターゲット、ソース)に適用します
- トランザクションの状態を
committed
に更新します - findを使用して、ドキュメントがトランザクションの状態を反映しているかどうかを判断します。問題がない場合は、トランザクションの状態を
done
に更新します。
さらに:
- 障害シナリオを手動で処理する必要があります(以下で説明するように何かが発生しませんでした)
- 基本的に
state
という名前を導入して、手動でロールバックを実装する必要があります 値canceling
実装に関するいくつかの具体的な注意事項:
-
lock_status
のようなフィールドを追加することはお勧めしません 、data_old
、data_new
ソース/ターゲットドキュメントに。これらは、ドキュメント自体ではなく、トランザクションのプロパティである必要があります。 - ターゲット/ソースドキュメントの概念を一般化するには、
DBref
を使用できると思います。 s:http://www.mongodb.org/display/DOCS/Database+References - トランザクションドキュメントが完了したら削除するというアイデアは好きではありません。状態を
done
に設定しています これにより、後でデバッグして、実行されたトランザクションの種類を確認できるため、より良いアイデアのように思われます。ディスクスペースが不足することはないと確信しています(このための解決策もあります)。 - モデルで、すべてが期待どおりに変更されたことをどのように保証しますか?どういうわけか変更を調べますか?