ユーザーが製品を作成してコメントを付けることができる単純なアプリケーションがあるとします。商品やコメントのスキーマは次のようになります。mongooseミドルウェアで従属文書を削除するときの同時性問題
var productSchema = new mongoose.Schema({
author_id: ObjectId,
description: String
});
var commentSchema = new mongoose.Schema({
product_id: ObjectId,
author_id: ObjectId,
message: String
});
すべてのコメントが既存の製品を参照していることを確認します。これは、簡単にフック保存マングースの前で行うことができます。
commentSchema.pre("save", function(next) {
Product.count({ _id: this.product_id }, function(err, count) {
if (err || !count) {
next(new Error("Could not find product"));
} else {
next();
}
});
});
また、ユーザーが製品を削除した場合、当社はその製品のすべてのコメントを削除したいです。
productSchema.pre("remove", function(next) {
Comment.remove({ product_id: this._id }, next);
});
しかし、ユーザーAが製品を削除すると同時に、ユーザーBがその製品についてコメントするとどうなりますか?
以下が発生する可能性があります:
Call pre save hook for new comment, and check if product exists
Call pre remove hook for product, and remove all comments
In pre save hook, done checking: product actually exists, call next
Comment saved
In pre remove hook, done removing comments: call next
Product removed
最終結果は、我々が存在しない製品を指し、コメントを持っているということです。
これは、これが発生する原因の多くの場合の1つに過ぎません。どのようにこのコーナーケースを防ぐことができますか?
ユーザーがコメントできない場所で遅延が発生する可能性があります。私はこれが何をスタックだと思います – pudility