MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでトランザクションロックを実現する方法|findOneAndUpdate()の活用

MongoDBでトランザクションロックを実現するには

MongoDB 4.0の環境では、マルチドキュメントにまたがるトランザクション機能が利用できないケースがあります。特にスタンドアロン構成では、複数ドキュメントを安全に更新するのが難しくなります。こうした状況で有効なのが、findOneAndUpdate()メソッドを活用した擬似的なロック機構の実装です。

この手法では、各ドキュメントに「in_transaction」というフラグフィールドを持たせることで、処理中のドキュメントが他のプロセスから二重に取得されるのを防ぎます。

サンプルコレクションの作成

まず、ドキュメントを格納するコレクションを作成しましょう。

> db.demo404.insertOne({"FirstName":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e6f8c38fac4d418a0178592")
}
> db.demo404.insertOne({"FirstName":"Robert"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e6f8c3cfac4d418a0178593")
}
> db.demo404.insertOne({"FirstName":"Mike"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e6f8c40fac4d418a0178594")
}

登録済みドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo404.find();

このクエリを実行すると、以下のような出力が得られます。

{ "_id" : ObjectId("5e6f8c38fac4d418a0178592"), "FirstName" : "John" }
{ "_id" : ObjectId("5e6f8c3cfac4d418a0178593"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5e6f8c40fac4d418a0178594"), "FirstName" : "Mike" }

findOneAndUpdate()によるロックの設定

続いて、findOneAndUpdate()を使ってドキュメントにロックをかけるクエリを見ていきましょう。

> result=db.demo404.findOneAndUpdate({"in_transaction": {"$exists": false}}, {"$set": {"in_transaction": true}});

このクエリを実行すると、次の出力が返されます。

{ "_id" : ObjectId("5e6f8c38fac4d418a0178592"), "FirstName" : "John" }

仕組みのポイント

このクエリが機能する理由は以下の通りです。

  • 検索条件:「in_transaction」フィールドが存在しないドキュメントのみを対象とします($exists: false)。
  • 更新内容:条件に合致した最初の1件に対して、「in_transaction」をtrueに設定します。
  • 原子性:findOneAndUpdate()はアトミックに動作するため、複数クライアントが同時に実行しても、同じドキュメントが二重にロックされることはありません。

上記の例では、Johnのドキュメントが「処理中」としてマークされ、以降のfindOneAndUpdate()呼び出しではRobertやMikeなど、まだロックされていない別のドキュメントが返されます。処理が完了したら、in_transactionフィールドを削除するかfalseに戻すことで、ロックを解放できます。このようにして、トランザクション機能がない環境でも安全な排他制御を実現できるのです。

  1. MongoDBで複数ドキュメントを一括挿入する方法(insertManyの使い方)

    MongoDBで大量のデータを一度に登録したい場合は、insertMany()メソッドを使用します。insertMany()を使うことで、1回のコマンド実行でコレクションに複数のドキュメントをまとめて挿入できます。サンプルコレクションの作成まずは、複数のドキュメントを含むコレクションを作成してみましょう。以下の例では、「demo729」というコレクションに、銀行名・カード種別・顧客情報を含む3件のドキュメントを挿入しています。> db.demo729.insertMany( [ ...    { BankName:"HDFC Bank",

  2. C#のインターフェイスとは?宣言方法と実装例をわかりやすく解説

    インターフェイスとは インターフェイスは、プロパティ、メソッド、イベントなどのメンバーを定義するための仕組みです。インターフェイスにはメンバーの「宣言」のみが含まれており、実際の処理内容(実装)は、そのインターフェイスを実装するクラス側で定義する必要があります。 この仕組みにより、インターフェイスは派生クラスが従うべき標準的な構造(いわば「契約」)を提供します。複数のクラスに対して共通のメンバーを持つことを強制できるため、コードの一貫性や保守性の向上に役立ちます。 インターフェイスの宣言方法 C#では、interfaceキーワードを使用してインターフェイスを宣言します。命名規則として、インタ