Chaturmind
LearnDSASystem DesignBlogPremium
Sign inGet started
Chaturmind

Structured learning paths for engineers who want to go deep. Written by practitioners.

Learn

  • Java
  • DSA
  • System Design
  • Spring Boot
  • AI / ML

Company

  • Blog
  • Premium
  • Contact

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Chaturmind. All rights reserved.

Built for engineers who want to go deep.


← Spring Data MongoDB

MongoDB Basics

  • Spring Data MongoDB
  • Indexing & Performance

Aggregation Pipeline

  • Aggregation Pipeline
  • Transactions in MongoDB
  • Schema Design Patterns
Chaturmind
← Spring Data MongoDB

MongoDB Basics

  • Spring Data MongoDB
  • Indexing & Performance

Aggregation Pipeline

  • Aggregation Pipeline
  • Transactions in MongoDB
  • Schema Design Patterns
HomeLearnSpring BootSpring Data & MongoDBAdvanced MongoDB
✓ FreeAdvanced· 13 min read

MongoDB Transactions

Use multi-document ACID transactions in MongoDB 4.0+ with session management and error handling.

Published April 10, 2025


MongoDB Transactions

MongoDB 4.0 introduced multi-document ACID transactions, enabling the same reliability guarantees as relational databases for operations spanning multiple documents or collections.

When to Use Transactions

Use transactions when you need atomicity across multiple writes:

  • Debit one account and credit another
  • Create an order and decrement inventory simultaneously
  • Write to multiple collections that must succeed or fail together

For single-document writes, MongoDB is always atomic by default — no transaction needed.

Spring Boot Transaction Example

@Service
@RequiredArgsConstructor
public class PaymentService {

    private final MongoTemplate mongoTemplate;
    private final MongoDatabaseFactory dbFactory;

    public void transferFunds(String fromId, String toId, BigDecimal amount) {
        MongoTransactionManager txManager = new MongoTransactionManager(dbFactory);
        TransactionTemplate txTemplate = new TransactionTemplate(txManager);

        txTemplate.execute(status -> {
            // Debit
            mongoTemplate.updateFirst(
                Query.query(Criteria.where("_id").is(fromId)
                    .and("balance").gte(amount)),
                new Update().inc("balance", amount.negate()),
                Account.class
            );

            // Credit
            mongoTemplate.updateFirst(
                Query.query(Criteria.where("_id").is(toId)),
                new Update().inc("balance", amount),
                Account.class
            );

            return null;
        });
    }
}

Using @Transactional Annotation

// application.properties
spring.data.mongodb.uri=mongodb://localhost:27017/mydb

// Configuration
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {
    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }
}

// Service
@Service
public class OrderService {

    @Transactional  // Works with MongoTransactionManager
    public Order createOrder(CreateOrderRequest request) {
        Order order = orderRepository.save(new Order(request));
        inventoryService.decrementStock(request.items()); // same transaction
        return order;
    }
}

Raw Driver Transactions

// MongoDB shell / driver
const session = client.startSession();
session.startTransaction({
    readConcern: { level: 'snapshot' },
    writeConcern: { w: 'majority' }
});

try {
    await accounts.updateOne(
        { _id: fromId }, { $inc: { balance: -amount } }, { session }
    );
    await accounts.updateOne(
        { _id: toId }, { $inc: { balance: amount } }, { session }
    );
    await session.commitTransaction();
} catch (error) {
    await session.abortTransaction();
    throw error;
} finally {
    session.endSession();
}

Transaction Limitations

  • Transactions must complete within 60 seconds by default
  • Multi-document transactions have higher performance overhead — avoid for single-document writes
  • Requires a replica set (or mongos in sharded cluster) — standalone instances don't support transactions
  • No DDL in transactions: cannot create collections or indexes inside a transaction

Read and Write Concerns

// Strongest consistency for financial operations
MongoTransactionManager txManager = new MongoTransactionManager(
    dbFactory,
    TransactionOptions.builder()
        .readConcern(ReadConcern.SNAPSHOT)
        .writeConcern(WriteConcern.MAJORITY)
        .build()
);

Interview Tips

  1. MongoDB transactions are supported but should be avoided for high-throughput scenarios — redesign your schema to use single-document operations when possible.
  2. The correct schema design principle: embed data that is read together to eliminate the need for multi-document transactions.
  3. Know the replica set requirement — transactions won't work on standalone.

Previous

Aggregation Pipeline

Next

Schema Design Patterns

AI Tutor

Lesson: MongoDB Transactions

Quick actions

AI responses can be inaccurate. Verify critical information.