一般的な応答として、MongoDBでのマルチドキュメントコミットは、2フェーズコミットとして実行できます。これは、マニュアルである程度詳細に文書化されています(https://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:https://www.mongodb.org/display/DOCS/Database+References - トランザクションドキュメントが完了したら削除するというアイデアは好きではありません。状態を
doneに設定しています これにより、後でデバッグして、実行されたトランザクションの種類を確認できるため、より良いアイデアのように思われます。ディスクスペースが不足することはないと確信しています(このための解決策もあります)。 - モデルで、すべてが期待どおりに変更されたことをどのように保証しますか?どういうわけか変更を調べますか?