在MongoDB中使用多文档事务的详细步骤

 更新时间:2026年04月07日 10:26:50   作者:Victor356  
在MongoDB中使用多文档事务,确保多个操作要么全部成功要么全部失败,实现数据一致性,通过会话和TransactionOptions配置事务,执行跨集合写操作,并提交或回滚事务,适用于需要确保数据一致性的复杂应用场景,本文介绍在MongoDB中使用多文档事务的步骤,感兴趣的朋友一起看看吧

在MongoDB中使用多文档事务可以确保多个操作要么全部成功,要么全部失败,从而确保数据的一致性。MongoDB的多文档事务类似于传统关系型数据库的事务,支持ACID(原子性、一致性、隔离性和持久性)特性。以下是详细的步骤和Java代码示例,展示如何在MongoDB中使用多文档事务。

前提条件

  1. 复制集:事务需要在MongoDB复制集(Replica Set)或分片集群(Sharded Cluster)中运行。
  2. MongoDB版本:确保使用MongoDB 4.0或更高版本。

1. 引入Maven依赖

首先,在 pom.xml 中引入 MongoDB Java 驱动依赖:

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver-sync</artifactId>
  <version>4.4.0</version>
</dependency>

2. Java代码示例

以下是一个完整的Java代码示例,展示如何在MongoDB中使用多文档事务:

import com.mongodb.MongoClientSettings;
import com.mongodb.MongoException;
import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.TransactionOptions;
import com.mongodb.WriteConcern;
import com.mongodb.client.ClientSession;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoDBTransactionExample {
    public static void main(String[] args) {
        // 创建 MongoClient
        MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
        // 获取数据库和集合
        MongoDatabase database = mongoClient.getDatabase("testdb");
        MongoCollection<Document> collection1 = database.getCollection("collection1");
        MongoCollection<Document> collection2 = database.getCollection("collection2");
        // 插入一些初始数据
        collection1.insertOne(new Document("account", "Alice").append("balance", 100));
        collection2.insertOne(new Document("account", "Bob").append("balance", 0));
        // 开始会话
        ClientSession session = mongoClient.startSession();
        // 配置事务选项
        TransactionOptions txnOptions = TransactionOptions.builder()
                .readPreference(ReadPreference.primary())
                .readConcern(ReadConcern.LOCAL)
                .writeConcern(WriteConcern.MAJORITY)
                .build();
        try {
            // 开始事务
            session.startTransaction(txnOptions);
            // 执行跨集合的写操作
            Document aliceAccount = collection1.find(session, new Document("account", "Alice")).first();
            if (aliceAccount != null && aliceAccount.getInteger("balance") >= 50) {
                collection1.updateOne(session, new Document("account", "Alice"),
                        new Document("$inc", new Document("balance", -50)));
                collection2.updateOne(session, new Document("account", "Bob"),
                        new Document("$inc", new Document("balance", 50)));
            } else {
                throw new RuntimeException("Insufficient balance!");
            }
            // 提交事务
            session.commitTransaction();
            System.out.println("Transaction committed.");
        } catch (MongoException | RuntimeException e) {
            // 回滚事务
            session.abortTransaction();
            System.err.println("Transaction aborted due to: " + e.getMessage());
        } finally {
            session.close();
        }
        mongoClient.close();
    }
}

解释代码

  1. 创建 MongoClient:连接到 MongoDB 实例。
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
  1. 获取数据库和集合:获取所需的数据库和集合引用。
MongoDatabase database = mongoClient.getDatabase("testdb");
MongoCollection<Document> collection1 = database.getCollection("collection1");
MongoCollection<Document> collection2 = database.getCollection("collection2");
  1. 插入初始数据:向集合中插入一些示例数据。
collection1.insertOne(new Document("account", "Alice").append("balance", 100));
collection2.insertOne(new Document("account", "Bob").append("balance", 0));
  1. 开始会话:通过 mongoClient.startSession() 开始一个会话。
ClientSession session = mongoClient.startSession();
  1. 配置事务选项:使用 TransactionOptions 配置事务的选项,比如读偏好、读关注和写关注。
TransactionOptions txnOptions = TransactionOptions.builder()
        .readPreference(ReadPreference.primary())
        .readConcern(ReadConcern.LOCAL)
        .writeConcern(WriteConcern.MAJORITY)
        .build();
  1. 开始事务:通过 session.startTransaction(txnOptions) 开始事务。
session.startTransaction(txnOptions);
  1. 执行跨集合的写操作:在事务中执行多个集合的写操作。
Document aliceAccount = collection1.find(session, new Document("account", "Alice")).first();
if (aliceAccount != null && aliceAccount.getInteger("balance") >= 50) {
    collection1.updateOne(session, new Document("account", "Alice"),
            new Document("$inc", new Document("balance", -50)));
    collection2.updateOne(session, new Document("account", "Bob"),
            new Document("$inc", new Document("balance", 50)));
} else {
    throw new RuntimeException("Insufficient balance!");
}
  1. 提交事务:如果所有操作成功,通过 session.commitTransaction() 提交事务。
session.commitTransaction();
System.out.println("Transaction committed.");
  1. 回滚事务:如果发生异常,通过 session.abortTransaction() 回滚事务。
catch (MongoException | RuntimeException e) {
    session.abortTransaction();
    System.err.println("Transaction aborted due to: " + e.getMessage());
}
  1. 关闭会话和客户端:最后关闭会话和 MongoDB 客户端连接。
finally {
    session.close();
}
mongoClient.close();

总结

通过上述代码示例,展示了如何在MongoDB中使用多文档事务来实现ACID特性。合理利用这些特性,可以在复杂应用场景中确保数据的一致性和可靠性。通过事务,可以保证在多个集合中的操作具有原子性、一致性、隔离性和持久性,从而确保数据的可靠性和一致性。

到此这篇关于如何在MongoDB中使用多文档事务的文章就介绍到这了,更多相关MongoDB使用多文档事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mongodb在UPDATE操作中使用$pull的操作方法

    Mongodb在UPDATE操作中使用$pull的操作方法

    在UPDATE中使用$pull操作符,删除数组中的指定元素或删除符合条件的数组元素,本文基于Mongodb的官方文档,介绍使用$pull, 按照指定条件删除数组中的元素,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • mongodb数据库的6个安全设置命令

    mongodb数据库的6个安全设置命令

    这篇文章主要介绍了mongodb数据库的6个安全设置命令,如安全模式启动、安全认证、数据读写加锁、解锁等,需要的朋友可以参考下
    2014-05-05
  • mongodb基础入门_动力节点Java学院整理

    mongodb基础入门_动力节点Java学院整理

    这篇文章主要为大家详细介绍了mongodb基础入门的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 如何通过MongoDB Atlas 实现语义搜索与 RAG(迈向AI的搜索机制)

    如何通过MongoDB Atlas 实现语义搜索与 RAG(迈向AI的搜索机制)

    MongoDBAtlas的语义搜索功能通过向量化存储和检索非结构化数据,结合RAG框架,实现了高效的知识检索和增强型生成应用,本文给大家介绍如何通过MongoDB Atlas 实现语义搜索与 RAG(迈向AI的搜索机制),感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • MongoDB索引类型汇总分享

    MongoDB索引类型汇总分享

    这篇文章主要介绍了MongoDB索引类型汇总,单字段索引、复合索引、多键索引、文本索引、2dsphere索引等多种索引类型,需要的朋友可以参考一下
    2022-04-04
  • 详解MongoDB中用sharding将副本集分配至服务器集群的方法

    详解MongoDB中用sharding将副本集分配至服务器集群的方法

    副本集是MongoDB的主从复制中的重要功能,经常被用来作额外的备份,这里我们就来详解MongoDB中用sharding将副本集分配至服务器集群的方法,首先还是来回顾一下MongoDB中副本集的基本知识:
    2016-07-07
  • 使用Locust对MongoDB进行负载测试的操作步骤

    使用Locust对MongoDB进行负载测试的操作步骤

    Locust是一款使用Python开发的开源性能测试工具,支持分布式,可在多台主机上对系统持续发送请求,本文给大家介绍了使用Locust对MongoDB进行负载测试的操作步骤,文中通过图文结合的方式介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • mongoDB 4.0事务回滚的辛酸历程探究

    mongoDB 4.0事务回滚的辛酸历程探究

    这篇文章主要给大家介绍了关于mongoDB 4.0事务回滚的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Windows系统下安装MongoDB并内网穿透远程连接

    Windows系统下安装MongoDB并内网穿透远程连接

    这篇文章主要给大家介绍了关于Windows系统下安装MongoDB并内网穿透远程连接的相关资料,文中通过图文将步骤介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • MongoDB学习笔记之GridFS使用介绍

    MongoDB学习笔记之GridFS使用介绍

    这篇文章主要介绍了MongoDB学习笔记之GridFS使用介绍,本文介绍了GridFS的作用、GridFS的一些使用方法、GridFS实现原理及注意事项等,需要的朋友可以参考下
    2015-07-07

最新评论