mongodb/node-mongodb-native · error · MongoTransactionError
Transactions do not support unacknowledged write concern
Error message
Transactions do not support unacknowledged write concern
What it means
Thrown by the @internal Transaction constructor when the resolved write concern has w === 0 (unacknowledged). MongoDB transactions require acknowledged writes because commit/abort depend on the server's command response, so the driver rejects unacknowledged write concern at transaction start. It is a MongoTransactionError.
Source
Thrown at src/transactions.ts:93
/**
* @internal
*/
export class Transaction {
state: TxnState;
options: TransactionOptions;
_pinnedServer?: Server;
_recoveryToken?: Document;
/** Create a transaction */
constructor(options?: TransactionOptions) {
options = options ?? {};
this.state = TxnState.NO_TRANSACTION;
this.options = {};
const writeConcern = WriteConcern.fromOptions(options);
if (writeConcern) {
if (writeConcern.w === 0) {
throw new MongoTransactionError('Transactions do not support unacknowledged write concern');
}
this.options.writeConcern = writeConcern;
}
if (options.readConcern) {
this.options.readConcern = ReadConcern.fromOptions(options);
}
if (options.readPreference) {
this.options.readPreference = ReadPreference.fromOptions(options);
}
if (options.maxCommitTimeMS) {
this.options.maxTimeMS = options.maxCommitTimeMS;
}
// TODO: This isn't technically necessaryView on GitHub (pinned to 3366c21a63)
Solutions
- Omit writeConcern from startTransaction options to let the driver use the default (acknowledged, majority on commit).
- If specifying writeConcern, use w >= 1 or 'majority'.
- Audit the client-level writeConcern and defaultTransactionOptions if the error appears without explicit transaction options.
Example fix
// before
await session.withTransaction(
async (s) => { await coll.insertOne(doc, { session: s }); },
{ writeConcern: { w: 0 } } // throws
);
// after
await session.withTransaction(
async (s) => { await coll.insertOne(doc, { session: s }); },
{ writeConcern: { w: 'majority' } }
); Defensive patterns
Strategy: validation
Validate before calling
function isAcknowledged(wc: any): boolean {
return wc == null || wc.w === undefined || wc.w === 'majority' ||
(typeof wc.w === 'number' && wc.w >= 1);
}
if (isAcknowledged(txnOptions.writeConcern)) {
session.startTransaction(txnOptions);
} Type guard
function isAcknowledgedWriteConcern(wc: unknown): boolean {
if (wc == null) return true;
if (typeof wc === 'object') {
const w = (wc as any).w;
return w === undefined || w === 'majority' || (typeof w === 'number' && w >= 1);
}
return false;
} Try / catch
try {
session.startTransaction(options);
} catch (e) {
if (e instanceof MongoTransactionError && /unacknowledged write concern/.test(e.message)) {
const { w: _, ...ack } = options.writeConcern ?? {};
session.startTransaction({ ...options, writeConcern: { ...ack, w: 'majority' } });
} else throw e;
} Prevention
- Never set w:0 on a client/session used for transactions.
- Validate writeConcern.w >= 1 before passing options to startTransaction/withTransaction.
- Keep fire-and-forget insert paths on a separate client from transactional paths.
When it happens
Trigger: Calling session.startTransaction({ writeConcern: { w: 0 } }), or inheriting a w:0 write concern from the client/defaultTransactionOptions and starting a transaction.
Common situations: Sharing a writeConcern configured for fire-and-forget inserts with transaction code; setting MongoClient writeConcern to { w: 0 } globally; copying options between code paths.
Related errors
- Transaction already in progress
- Function provided to `withTransaction` must return a Promise
- Unable to make a writeConcern from fsync=${value}
- Unable to make a writeConcern from journal=${value}
- Invalid WriteConcern cannot parse: ${JSON.stringify(value)}
AI-assisted analysis of mongodb/node-mongodb-native@3366c21a63 (2026-08-04).
Data as JSON: /data/errors/361822ad2ec3f1e9.json.
Report an issue: GitHub.