找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 62|回复: 0

Java 和 MongoDB 4.0 支持多文档 ACID 事务

[复制链接]

1

主题

0

回帖

5

积分

新手上路

积分
5
发表于 2024-1-22 23:06:38 | 显示全部楼层 |阅读模式
本文是与MongoDB合作创建的。感谢您对合作伙伴的支持,使 SitePoint 成为可能。 MongoDB 4.0添加了对多文档 ACID 事务的支持。 但是等等……这是否意味着 MongoDB 到目前为止还不支持事务? 不,实际上MongoDB一直支持单文档事务形式的事务。MongoDB 4.0 将这些事务保证扩展到多个文档、多个语句、多个集合和多个数据库。如果没有任何形式的事务数据完整性保证,数据库有什么好处呢? 在我们深入讨论这篇博文之前,您可以在此处找到所有代码并尝试多文档 ACID 事务。 快速开始 第 1 步:启动 MongoDB 在 localhost、端口 27017 上启动最低版本 4.0.0 的单节点 MongoDB ReplicaSet。 如果您使用 Docker: 您可以使用start-mongo.sh。 完成后,您可以使用stop-mongo.sh. 如果您想使用 Mongo Shell 连接到 MongoDB,可以使用connect-mongo.sh. 如果您喜欢手动启动 mongod 第2步:启动Java 该演示包含两个主要程序:ChangeStreams.java和Transactions.java。


Change Steams 允许您收到 MongoDB 集合或数据库中任何数据更改的通知。 交易过程就是演示本身。 您需要两个 shell 来运行它们。 如果您使用 Docker: 第一个外壳: 第二个外壳: transactions-docker.sh 如果您不使用 Docker,则需 WhatsApp 号码数据 要安装 Maven 3.5.X 和 JDK 10(或最低 JDK 8,但需要更新 pom.xml 中的 Java 版本): 第一个外壳  第二个外壳: transactions.sh 让我们将现有的单文档事务与 MongoDB 4.0 的符合 ACID 的多文档事务进行比较,看看如何通过 Java 利用这一新功能。 MongoDB 4.0 之前 即使在 MongoDB 3.6 及更早版本中,每个写入操作都表示为一个事务,其范围仅限于存储层中单个文档的级别。由于文档模型将相关数据汇集在一起​​,否则这些数据将在表格模式中跨单独的父子表进行建模,因此 MongoDB 的原子单文档操作提供的事务语义可以满足大多数应用程序的数据完整性需求。

photo_2024-01-21_14-45-46.jpg


修改多个文档的每个典型写入操作实际上都发生在几个独立的事务中:每个文档一个事务。 让我们以一个非常简单的库存管理应用程序为例。 首先,我需要一个 MongoDB 副本集,因此请按照上面给出的说明启动 MongoDB。 现在让我们将以下文档插入到product集合中 假设正在进行促销活动,我们希望为客户提供所有产品 20% 的折扣。 但在应用此折扣之前,我们希望通过 Change Streams 监控 MongoDB 中何时发生这些操作。 在 Mongo Shell 中执行以下命令正如您所看到的,两个操作的集群时间(参见关键clusterTime)是不同的:操作发生在同一秒内,但时间戳计数器已加一。 因此,这里每个文档一次更新一个,即使这种情况发生得非常快,其他人也可以在更新运行时阅读文档,并且只能看到具有折扣的两种产品中的一种。 大多数时候,您可以在 MongoDB 数据库中容忍这种情况,因为我们会尽可能在同一文档中嵌入紧密链接或相关的数据。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|芝加哥华人服务中心

GMT-5, 2024-5-3 00:37 , Processed in 0.079697 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表