Optimistic locking — prevents lost updates using a version column.
1// Schema with version2const userSchema = new mongoose.Schema({3 name: String,4 email: String,5 version: { type: Number, default: 0 },6});78// Update with version check9async function updateUser(id, updates, expectedVersion) {10 const result = await User.findOneAndUpdate(11 { _id: id, version: expectedVersion },12 { $set: updates, $inc: { version: 1 } },13 { new: true }14 );1516 if (!result) {17 throw new Error("Conflict: data was modified by another user");18 }19 return result;20}2122// Usage23app.put("/users/:id", async (req, res) => {24 try {25 const user = await updateUser(26 req.params.id,27 req.body,28 req.body.version29 );30 res.json(user);31 } catch (err) {32 res.status(409).json({ error: err.message });33 }34});
SQL version:
1UPDATE users SET name = $1, version = version + 12WHERE id = $2 AND version = $3
Key points: