Error
Error Code:
251
MongoDB Error 251: No Such Transaction Found
Description
This error indicates that an operation attempted to interact with a transaction that MongoDB could not find or recognize. It typically occurs when a transaction ID is invalid, expired, or refers to a transaction that was already committed or aborted. This signals an issue with the client's understanding of the transaction's lifecycle on the server.
Error Message
No Such Transaction
Known Causes
3 known causesInvalid Transaction ID
The transaction ID used in an operation does not correspond to an active, valid transaction known by the MongoDB server. This can occur if the ID is incorrect or references a transaction that has already timed out.
Transaction Already Closed
An operation attempted to interact with a transaction that was previously committed, aborted, or implicitly ended by the server. The transaction no longer exists in an active state.
Client Logic Error
The client application's transaction management logic is out of sync with the server, leading to attempts to use a transaction session or ID that the server no longer recognizes as active.
Solutions
4 solutions available1. Retry the Transaction easy
Transient error - safe to retry
1
Implement transaction retry
async function runTransaction(operations, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const session = client.startSession();
try {
session.startTransaction();
await operations(session);
await session.commitTransaction();
return;
} catch (err) {
await session.abortTransaction();
if (err.hasErrorLabel('TransientTransactionError') && i < maxRetries - 1) {
continue;
}
throw err;
} finally {
session.endSession();
}
}
}
2. Reduce Transaction Duration medium
Shorter transactions less likely to abort
1
Move work outside transaction
// Bad: Long-running transaction
const session = client.startSession();
session.startTransaction();
const doc = await coll.findOne({}, { session });
const processed = await heavyProcessing(doc); // Slow!
await coll.updateOne({}, { $set: processed }, { session });
await session.commitTransaction();
// Good: Minimize transaction scope
const doc = await coll.findOne({}); // Outside transaction
const processed = await heavyProcessing(doc);
const session = client.startSession();
session.startTransaction();
await coll.updateOne({}, { $set: processed }, { session });
await session.commitTransaction();
3. Increase Transaction Timeout medium
Allow more time for transaction
1
Set transaction options
session.startTransaction({
maxCommitTimeMS: 60000,
readConcern: { level: 'snapshot' },
writeConcern: { w: 'majority' }
});
4. Check for Conflicting Operations advanced
Identify what's causing aborts
1
Check current operations
db.currentOp({ "lsid": { $exists: true } })
2
Monitor transaction metrics
db.serverStatus().transactions