MongoDBのペシミスティックロックを設定する方法
MongoDBでは悲観ロックを直接かけることはできず、トランザクションを用いて実現します。トランザクションは一連の操作で、すべて成功するか、すべてがロールバックされます。
MongoDB ではコレクションの startSession() メソッドを使ってセッションを作成し、そのセッションを使用してトランザクションを実行することができる。
MongoDBのトランザクションとセッションを使用した悲観的ロックの実装例を示します。
const session = db.getMongo().startSession();
session.startTransaction();
try {
// 获取锁
db.collection.updateOne(
{ _id: ObjectId("documentId"), locked: false },
{ $set: { locked: true } }
);
// 在锁定的状态下执行操作
// ...
// 释放锁
db.collection.updateOne(
{ _id: ObjectId("documentId"), locked: true },
{ $set: { locked: false } }
);
session.commitTransaction();
} catch (error) {
session.abortTransaction();
throw error;
} finally {
session.endSession();
}
上記の例では、セッションを作成し、トランザクションを開始します。トランザクション内では、最初にupdateOne() メソッドによるロックの取得、ロック状態での操作の実行、最後にロックの解放を行います。トランザクション内でエラーが発生した場合には、トランザクションを中止し、エラーをスローします。トランザクションが成功したかどうかに関わらず、最後にセッションをクローズします。
MongoDB のトランザクションとセッションの機能は MongoDB 4.0 から導入されたので、トランザクションを利用するには MongoDB のバージョンが対応している必要があります。