transaction rollback mongoose

Transaction Rollback in Mongoose

If you are using Mongoose to interact with MongoDB, you may need to perform multiple operations within a single transaction. In such cases, the ability to roll back a transaction becomes crucial.

What is a transaction?

In MongoDB, a transaction is a group of operations that are executed as a single unit of work. If any operation within the transaction fails, the entire transaction is rolled back and all changes made by the transaction are discarded. MongoDB supports transactions only for replica sets or sharded clusters with MongoDB 4.0 or later.

How to use transactions in Mongoose?

Mongoose provides a built-in support for transactions using the session API. To use transactions in Mongoose, you need to create a new session and pass it to all the operations you want to include in the transaction. Here's an example:


const session = await mongoose.startSession();
session.startTransaction();

try {
  // perform some operations
  await Model1.create([{ name: 'John' }, { name: 'Jane' }], { session });
  await Model2.updateOne({ name: 'John' }, { $set: { age: 25 } }, { session });

  // commit the transaction
  await session.commitTransaction();
} catch (error) {
  // rollback the transaction
  await session.abortTransaction();
}

session.endSession();

In the above example, we create a new session using mongoose.startSession() method and start a transaction using session.startTransaction(). We then perform some operations on two models (Model1 and Model2) and pass the session to each operation using the { session } option. If any operation fails, we catch the error and call session.abortTransaction() to roll back the transaction. If all operations succeed, we call session.commitTransaction() to commit the transaction.

Rollback on Error Automatically

You can also set up Mongoose to automatically roll back a transaction if any operation within it fails. To do this, you need to pass a retryWrites option with a value of false to the session constructor. Here's an example:


const session = await mongoose.startSession({ retryWrites: false });
session.startTransaction();

try {
  // perform some operations
  await Model1.create([{ name: 'John' }, { name: 'Jane' }], { session });
  await Model2.updateOne({ name: 'John' }, { $set: { age: 25 } }, { session });

  // commit the transaction
  await session.commitTransaction();
} catch (error) {
  // the transaction will be rolled back automatically
}

session.endSession();

In the above example, we pass the { retryWrites: false } option to the mongoose.startSession() method to disable retryable writes. This causes any error within a transaction to trigger an automatic rollback.

Conclusion

Mongoose provides a convenient way to use transactions in MongoDB using the session API. By creating a new session and passing it to all the operations within a transaction, you can ensure that all changes made by the transaction are either committed or rolled back as a single unit of work.

Subscribe to The Poor Coder | Algorithm Solutions

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe