我有一個模型叫其具有如下架構如何保證兩個用戶可以原子確認交易已經發生MongoDB中
var transactionSchema = new mongoose.Schema({
amount: Number,
status: String,
_recipient: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
_sender: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
});
我想無論是發送者和本次交易的收件人能夠「一交易確認交易發生了。 status
作爲「初始」開始。因此,當只有發件人確認了交易(但收件人尚未),我想將status
更新爲「senderConfirmed」或其他內容,並且當收件人已確認(但發件人尚未)時,我想將狀態更新爲「recipientConfirmed」。當他們有這兩個證實它,我想更新狀態爲「完成」。
問題是,我怎麼知道什麼時候以避免競爭條件的方式將其更新爲「完成」?如果發送方和接收方都同時確認交易,那麼兩個線程都會認爲狀態爲「初始」,並將其更新爲「senderConfirmed」或「recipientConfirmed」,實際上它應該轉到「完成」 。
我讀過關於MongoDB的兩階段提交方法here但這並不完全符合我的需要,因爲我不知道(在另一個線程當前正在修改事務的情況下)想要阻止第二個線程執行其更新 - 我只是想要它等待,直到第一個線程完成更新之前完成,然後使其更新的內容取決於事務的最新狀態。