在没有副本集或最少配置的情况下启用 MongoDB 事务

fly*_*fly 8 database transactions mongodb replicaset mongodb-replica-set

[一些背景信息 - 可能可以跳过]

首先,我对数据库管理几乎没有任何了解,对后端领域的猫鼬和节点只有肤浅的经验(一些 udemy 课程)。Udemy 课程让我相信 mongodb 仍然是具有关系属性的数据库的可行选择,因此我开始为类似论坛的网站开发后端。在了解事务之后,我尝试在后端实现它们,因为在执行一组查询时实现回滚功能似乎是完全必要的。然而事实证明,事务只能在副本集上进行——对于启动 MVP 来说,这似乎也需要至少 2. 3 个数据库,这显然被认为是一种矫枉过正。

[问题]

  1. 是否可以只用1个数据库来实现事务?如果是这样怎么办?

  2. 如果上述不可能,那么如何在实现事务的同时以最小的配置启动 mongodb 数据库,并且考虑到该数据库是用于启动 MVP 的。

  3. (对于任何有在类似场景中实现生产级 mongo 数据库经验的人)如果不考虑使用事务,如何在不使用事务的情况下安全地将编辑/创建多个文档的查询发送到 mongoDB 数据库,同时不喷洒所有代码使用由查询组成的 try-catch 来回滚每个故障点(我认为开销太大)

我的截止日期很紧,并且已经使用 mongoose 完成了大量的基础工作和几条路线,这意味着目前放弃 mongodb 而使用关系数据库将是一个困难的选择。

我想我已经用谷歌搜索了与该主题相关的所有内容,甚至在谷歌搜索的第二页中尝试了博客/文章(包括我自己在内的许多人认为这是暗网)。但我确实认为我可能错过了我正在寻找的内容,并且也欢迎仅包含链接的答案。

感谢您的阅读!

D. *_* SM 9

您需要副本集[*]才能使用事务,但您可以创建单节点副本集用于测试目的。

文档中描述了完整的过程,对于单节点 RS,您可以按照书面说明进行操作,但仅配置单个成员。

简而言之,您需要传递--replSet参数mongod,然后通过mongoshell 连接到它并运行rs.initiate()

请注意,交易并不是解决所有问题的灵丹妙药。在某些情况下它们是合适的,而在某些情况下 MongoDB 提供了更适合的其他功能。

[*] 或使用 MongoDB 4.2+ 的分片集群,但这涉及更多的设置工作。