MongoDB支持哪些类型的文档事务

聊聊MongoDB中连接池、索引、事务 索引可以显著缩短查询时间,但是,使用索引也是有代价的,索引字段的增删改操作会花费更长时间,因为在更改数据时,除了更新文档数据,MongoDB还必须更新索引。这个和关系型数据库是一样的。索引可以显著缩短查询时间,但是,使用索引也是有代价的,索引字段的增删改操作会花费更长时间,因为在更改数据时,除了更新文档数据,MongoDB还必须更新索引。事务是数据库中处理的逻辑单元,包括一个或多个数据库操作,既可以是读操作,也可以是写操作,MongoDB支持跨个多操作、集合、数据库、文档和分片的ACID事务。 阅读详情

MongoDB 支持的文档事务主要适用于副本集(replicasets)和分片集群(sharded clusters),并且这些事务是跨多个文档的。具体来说,MongoDB 提供了以下几种类型的文档事务:

多文档事务:这是 MongoDB 4.0 及更高版本中引入的最常见的文档事务类型。它允许你在单个事务中跨多个集合执行多个读写操作。这些操作要么全部成功,要么全部失败,从而保持数据的一致性。

单文档事务:虽然 MongoDB 通常与多文档事务一起讨论,但实际上单个文档的更新操作在 MongoDB 中也是原子性的。也就是说,单个文档的 update 或 replace 操作本身就是原子的,不需要显式的事务。但是,当需要跨多个文档或集合保持一致性时,就需要使用多文档事务。

读写事务:MongoDB 的事务支持读写操作。你可以在一个事务中读取数据,基于这些数据做出决策,然后写入或更新数据。

分布式事务:在分片集群中,MongoDB 支持跨多个分片的事务。这意味着你可以在一个事务中访问多个分片上的数据,并确保这些操作的原子性。

会话(Sessions):在 MongoDB 中,事务与会话相关联。每个事务都在一个会话的上下文中执行。会话提供了在客户端和 MongoDB 服务器之间跟踪事务状态的方法。

隔离性:MongoDB 的事务提供了隔离性保证,这意味着在事务执行期间,其他事务或操作不会看到该事务未提交的更改。

持久性:一旦事务提交,MongoDB 就会确保更改是持久的,即使系统发生故障也不会丢失。

在Java中,使用MongoDB的官方Java驱动程序(MongoDB Java Driver)来控制事务通常涉及以下步骤:

连接到MongoDB副本集或分片集群。

创建一个会话(ClientSession)。

在会话中开始事务。

执行多个读写操作。

提交或回滚事务。

关闭会话。

以下是一个简单的Java代码示例,演示了如何使用MongoDB Java Driver控制事务:

java

import com.mongodb.MongoClientSettings;

import com.mongodb.MongoCredential;

import com.mongodb.ServerAddress;

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 com.mongodb.client.model.Filters;

import com.mongodb.client.result.UpdateResult;

import org.bson.Document;

 

import java.util.Arrays;

 

public class MongoTransactionExample {

 

    public static void main(String[] args) {

        // 连接到MongoDB(这里以副本集为例)

        MongoCredential credential = MongoCredential.createCredential("username", "databaseName", "password".toCharArray());

        MongoClientSettings settings = MongoClientSettings.builder()

                .applyToClusterSettings(builder ->

                        builder.hosts(Arrays.asList(new ServerAddress("host1:27017"), new ServerAddress("host2:27017"))))

                .credential(credential)

                .build();

 

        MongoClient mongoClient = MongoClients.create(settings);

 

        try (MongoDatabase database = mongoClient.getDatabase("databaseName")) {

            // 创建一个新的会话

            try (ClientSession session = mongoClient.startSession()) {

                // 设置会话级别为事务

                session.startTransaction();

 

                // 获取集合

                MongoCollection<Document> collection = database.getCollection("collectionName");

 

                // 执行一个写操作

                UpdateResult updateResult = collection.updateOne(session, Filters.eq("someField", "someValue"),

                        new Document("$set", new Document("newField", "newValue")));

 

                // ... 在这里可以添加其他读写操作 ...

 

                // 如果所有操作都成功,提交事务

                session.commitTransaction();

                System.out.println("Transaction committed successfully");

 

            } catch (Exception e) {

                // 发生异常时,回滚事务

                if (session != null) {

                    session.abortTransaction();

                }

                e.printStackTrace();

            }

        }

 

        // 关闭客户端连接

        mongoClient.close();

    }

}

 

 

注意:

 

你需要将上述代码中的 "username", "databaseName", "password", "host1:27017", "host2:27017", "collectionName", "someField", "someValue", "newField", "newValue" 替换为你自己的实际值。

确保你的MongoDB集群是副本集或分片集群,因为单实例MongoDB不支持事务。

请注意错误处理和资源管理。在上面的示例中,我们使用了try-with-resources语句来自动关闭MongoDatabase和ClientSession。如果你不使用try-with-resources,则需要确保在不再需要它们时显式关闭它们。

在执行事务时,确保所有操作都在相同的会话中执行,以确保它们属于同一个事务。

 

SpringDataMongoDB多文档事务的实现 mongodb4.0也出来一段时间了,这个版本最为大众期待的特性就是支持了多文档事务。这篇文章主要介绍了SpringDataMongoDB多文档事务的实现,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 554

MongoDB多文档事务详解

原子性(atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。一致性(consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。隔离性(isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。持久性(durability):已被提交的事务对数据库的修改应该是永久性的。在MongoDB中,对单文档的操作是原子的。

qq_44027353的博客 1766

MQTT在智能家居中的实战:用Android手机控制ESP8266设备(基于EMQX)

本文详细介绍了如何利用MQTT协议构建一个完整的智能家居控制系统,通过Android手机App远程操控ESP8266设备。文章提供了从EMQX服务器部署、ESP8266端Arduino固件开发到Android客户端搭建的完整实战指南,并深入探讨了系统联调、稳定性优化与安全加固等关键环节,为物联网开发者提供了一套可复用的解决方案。

ujm567890的博客 457

MongoDB基础入门到深入(六)多文档事务

事务(transaction)是传统数据库所具备的一项基本能力,其根本目的是为数据的可靠性与一致性提供保障。而在通常的实现中,事务包含了一个系列的数据库读写操作,这些操作要么全部完成,要么全部撤销。例如,在电子商城场景中,当顾客下单购买某件商品时,除了生成订单,还应该同时扣减商品的库存,这些操作应该被作为一个整体的执行单元进行处理,否则就会产生不一致的情况。

秃了也弱了 1286

四阶龙格库塔法求解一次常微分方程组(python实现)

之前在博客发布了关于使用四阶龙格库塔方法求解一次常微分方程组的文章,由于代码缺少具体的验证,部分朋友可能存在疑问,因此这里打算再重新写一篇博客来验证一下程序的正确性,另外,这里是使用python语言来实现的。

HelloWorldTM的博客 8543

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 635

MongoDB 事务

一直以来,是MongoDB一直被诟病的问题,当然也可以说这是NoSQL数据库的一种权衡(放弃事务,追求高性能、高可扩展)但实质上,MongoDB很早就有事务的概念,但是这个事务只能是针对单文档的,即单个文档的操作是有原子性保证的。在4.0版本之后,MongoDB4.0版本支持副本集范围的多文档事务。4.2版本支持跨分片的多文档事务(基于两阶段提交)。在事务的隔离性上,MongoDB支持快照snapshot的隔离级别,可以避免脏读、不可重复读和幻读。

程序猿进阶 3571

WPF的基础设施:XAML基础语法

XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。

Hare的博客 1758

2. MongoDB分片集群架构实战-----MongoDB分片集群和多文档事务详解

分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表"。不同的点在于,MongoDB本身就自带了分片管理的能力,对于开发者来说可以做到开箱即用。为什么要使用分片?MongoDB复制集实现了数据的多副本复制及高可用,但是一个复制集能承载的容量和负载是有限的。在你遇到下面的场景时,就需要考虑使用分片了∶存储容量需求超出单机的磁盘容量。活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。

俺就是菜的很的博客 4040

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 621

mongodb 基本原理:事务(Transactions)

mongodb单文档的操作是原子性的,所以可以将关联的数据存在一份文档里,而不是放在不同的文档,这种方式可以应对大多数多文档原子操作的场景。 对于要读写多文档的原子性,mongodb 提供了事务。基于分布式事务,mongodb 可以提供跨数据集、db、文档和分片的原子性 事务api详见:Transactions API 事务与原子性 分布式事务与多文档的事务 mongodb4.2 ...

guangyacyb的博客 2541

RT-DETR改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU)

为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。

Limiiiing的博客 1966

MongoDB 4.0 多文档事务相关

在MongoDB4.0版本之前只支持单文档事务操作,在4.0版本之后开始支持多文档事务操作 事务和副本集 在MongoDB中多文档事务操作只支持副本集的操作,关于在分片上的事务操作会在4.2版本中引入 存储引擎 在MongoDB中只有 WiredTiger 存储引擎才支持多文档事务操作,在 in-memory 和 MMAPv1存储引擎 中不支持多文档事务操作 事务和操作 事务支持在已经存在的c...

weixin_34067980的博客 539

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MongoDB中的事务支持情况及其限制

MongoDB 的事务功能为处理复杂的业务逻辑提供了强大的支持,但在使用时需要注意上述限制。通过合理设计事务逻辑和配置适当的和,可以有效地利用事务功能,同时确保系统的性能和可靠性。

qq_33240556的博客 862

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MongoDB4.2总结

什么是MongoDB MongoDB是一个面向文档的NoSQL数据库,用于大容量数据存储 MongoDB中每个数据库都包含集合,而集合又包含文档,每个文档可以有不同的字段数。每个文档的大小和内容可以彼此不同。不需要预先定义模式。相反,可以动态创建字段。 为什么使用MongoDB 1.面向文档将数据存储在文档中,能够适应实际的业务环境和需求。 2.支持完全索引,包含内部对象 3.支持复制和故障恢复 4.文件存储格式为BSON(一种JSON的扩展) MongoDB和RDBMS之间的差异 1.在

者羽_zb的博客 728

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MongoDB

MongoDB采用了面向文档的数据模型,它使用JSON风格的文档来存储数据,这些文档可以包含各种类型的数据,包括嵌套文档和数组。从对比中我们可以看出MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。:当需要执行复杂的操作,需要确保这些操作要么全部成功,要么全部失败时,可以使用事务。:MongoDB支持丰富的查询功能,包括索引、聚合管道、地理空间查询等,可以满足实时分析和查询的需求,如实时监控、日志分析和智能推荐等。

qq_65032048的博客 2160

MongoDB发布4.0版本,支持ACID事务

MongoDB最近发布了最新的4.0版本。毫无疑问,这一版本的主要特性是支持多文档ACID事务。MongoDB向与关系型数据库产品的融合迈出了一大步,现在支持会话的概念,...

dotNET跨平台 1914

MongoDB数据库设计

MongoDB本身不强制使用schema,但是我们在做一个服务应用的时候,应该要知道数据应该怎么组织。

achang07的博客 5753

MongoDB 发布了最新的 4.0 版本,支持事务处理。

MongoDB 最近发布了最新的 4.0 版本。 毫无疑问,这一版本的主要特性是支持多文档 ACID 事务。MongoDB 向与关系型数据库产品的融合迈出了一大步,现在支持会话的概念,并可以使用 start_transaction() 和 commit_transaction() 方法将多个数据库命令包含在单个 MongoDB 事务中。 MongoDB 的事务遵循著名的 ACID 模型。...

Peter_Changyb的博客 4037

(转载)MongoDB发布4.0版本,支持ACID事务

MongoDB 最近发布了最新的 4.0 版本。 毫无疑问,这一版本的主要特性是支持多文档 ACID 事务。MongoDB 向与关系型数据库产品的融合迈出了一大步,现在支持会话的概念,并可以使用 start_transaction() 和 commit_transaction() 方法将多个数据库命令包含在单个 MongoDB 事务中。 MongoDB 的事务遵循著名的 ACID 模型。原子性...

weixin_39639119的博客 222

MongoDB4.0支持多文档ACID事务意味着什么?

消息显示,MongoDB 4.0将于今年夏季正式发布,而该版本最大的变化是将支持多文档 ACID事务,这不仅意味着MongoDB由专业数据库向通用数据库的转变,更意味着企业摆脱关系数据库的最后障碍已经被消除。 ...

ctkx13896的博客 393

MongoDB中的文档是什么?它与关系型数据库中的行有什么区别?

虽然 MongoDB 的文档模型提供了更大的灵活性和可扩展性,但它并不适合所有的应用场景。选择哪种类型的数据库取决于具体需求,包括数据结构、一致性要求、查询复杂度等因素。对于那些需要高度灵活的数据模型并且能够容忍最终一致性的应用来说,MongoDB 是一个很好的选择。而对于需要严格事务保证和复杂关系查询的应用,则可能更适合使用传统的关系型数据库。

qq_33240556的博客 538

MongoDB最常见的10个说法,全都错了!

点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Perhaps the most important thing in life i...

程序员小乐 977

MongoDB需要知道的点

MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.相对于json多了date类型和二进制数组。集合就是一组 MongoDB 文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。文档由一组key value组成。

窦再兴的博客 1077
上一篇: oracle union all 还有什么链接符号处理结果集的合并
下一篇: js 数组方法pop() push() unshift() shift()区别
codedadi
博客等级 码龄3年 1330粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值