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 necessary

View on GitHub (pinned to 3366c21a63)

Solutions

  1. Omit writeConcern from startTransaction options to let the driver use the default (acknowledged, majority on commit).
  2. If specifying writeConcern, use w >= 1 or 'majority'.
  3. 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

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


AI-assisted analysis of mongodb/node-mongodb-native@3366c21a63 (2026-08-04). Data as JSON: /data/errors/361822ad2ec3f1e9.json. Report an issue: GitHub.