ACID Transactions in MongoDB
ACID Transactions in MongoDB
In MongoDB, single-document writes are always atomic. Starting in version 4.0 (for replica sets) and version 4.2 (for sharded clusters), MongoDB introduced full multi-document distributed ACID transactions using sessions.
Single-Document vs Multi-Document Transactions
| Aspect | Single-Document Atomicity | Multi-Document ACID Transactions |
|---|---|---|
| Scope | Operations modifying a single document (including embedded arrays/objects) | Operations spanning multiple documents, collections, or shards |
| Mechanism | Native atomic write locks at the WiredTiger storage engine level | Client sessions using session.startTransaction() and session.commitTransaction() |
| Performance Overhead | Negligible (standard write operation) | Higher memory, write-lock contention, and coordination cost |
| Default Timeout | No transaction timeout | 60 seconds (enforced by transactionLifetimeLimitSeconds) |
| Rollback Support | Automatic if operation errors during write | Explicit abort via session.abortTransaction() |
Code Example (Multi-Document Transaction)
const session = client.startSession();
try {
session.startTransaction({
readConcern: { level: 'snapshot' },
writeConcern: { w: 'majority' }
});
await db.accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } }, { session });
await db.accounts.updateOne({ _id: 2 }, { $inc: { balance: 100 } }, { session });
await session.commitTransaction();
} catch (error) {
await session.abortTransaction();
} finally {
await session.endSession();
}
Design Takeaway
Leverage embedded documents where possible to achieve atomicity naturally. Reserve multi-document transactions for critical multi-entity operations like financial transfers.