Skip to content

Documentation / @andrew_l/mongo-transaction / withMongoTransaction

Function: withMongoTransaction()

withMongoTransaction(options)

withMongoTransaction<T, K, Args>(options): WithMongoTransactionWrapped<T, K, Args>

Runs a provided callback within a transaction, retrying either the commitTransaction operation or entire transaction as needed (and when the error permits) to better ensure that the transaction can complete successfully.

Passes the session as the function's first argument or via useMongoSession() hook

Type Parameters

T

K = any

Args extends any[] = any[]

Parameters

options: WithMongoTransactionOptions<T, K, Args>

Returns

WithMongoTransactionWrapped<T, K, Args>

Example

ts
const executeTransaction = withMongoTransaction({
  connection: () => mongoose.connection.getClient(),
  async fn() {
    const session = useMongoSession();
    const orders = mongoose.connection.collection('orders');

    const { modifiedCount } = await orders.updateMany(
      { status: 'pending' },
      { $set: { status: 'confirmed' } },
      { session },
    );
  },
});

withMongoTransaction(connection, fn, options)

withMongoTransaction<T, K, Args>(connection, fn, options?): WithMongoTransactionWrapped<T, K, Args>

Runs a provided callback within a transaction, retrying either the commitTransaction operation or entire transaction as needed (and when the error permits) to better ensure that the transaction can complete successfully.

Passes the session as the function's first argument or via useMongoSession() hook

Type Parameters

T

K = any

Args extends any[] = any[]

Parameters

connection: ConnectionValue

fn: Callback<T, K, Args>

options?: Omit<WithMongoTransactionOptions<any, any, any[]>, "fn" | "connection">

Returns

WithMongoTransactionWrapped<T, K, Args>

Example

ts
const executeTransaction = withMongoTransaction(mongoose.connection.getClient(), async () => {
  const session = useMongoSession();
  const orders = mongoose.connection.collection('orders');

  const { modifiedCount } = await orders.updateMany(
    { status: 'pending' },
    { $set: { status: 'confirmed' } },
    { session },
  );
});