2

我是 MongoDB 新手,作为学习练习,我正在 MongoDB 中使用 Java 开发图书馆管理系统。我遇到的问题是,如何在以下场景中确保 Transaction 属性:

我有一个 Book 类和一个 Author 类,它们具有多对多的关系。现在,当我保存特定书籍时,它可能有多个作者。我首先保存/更新作者,包括生成的书籍 ID,然后我将使用作者 ID 保存书籍类。现在,如何确保这个多文档保存遵循事务属性?

通过搜索以前的帖子,我得到了MongoDB 网站中给出的两阶段提交计划,但我不清楚如何在我的应用程序中使用该方法。

到目前为止,我已经通过文档的影子备份来替代“回滚”和“提交”,但从长远来看,这是不可行的,因为它会使数据库大小翻倍。另外,我想知道为什么 MongoDB 没有内置的方法来处理事务。

4

1 回答 1

2

我想知道为什么 MongoDB 没有内置的方法来处理事务。

交易很难。我认为有三个论点可以解释为什么一个人可以没有它们而生活:

  1. 在 SQL 中,事务非常重要,因为您正在分解对象。发票在 SQL 中没有行项目,但行项目引用发票。因此,部分提交可能会导致发票丢失一半的行项目(但一切显然都有效)。由于 MongoDB 支持嵌入,因此您不需要拆分所有对象,并且对连接和事务的需求也不那么严重(尽管通常要小心嵌入)。

  2. 数据库事务很好,但需要业务事务是相当普遍的,即运行时间更长的操作,可能必须等待 API 调用、用户交互等。这个逻辑,包括回滚此类事务的逻辑必须在应用程序代码。

  3. 可扩展性:交易在单台机器上很棘手,但在分片和复制的环境中却是残酷的。您必须有一个事务协调器,它位于某处,等待一切完成并返回或最终将其称为退出并发送回滚。现在图像有一个网络分区或事务协调器出现故障......所有这些都很难实现并且会影响性​​能。它还向开发人员隐藏了大量的复杂性。同样,最好在应用程序代码中处理这个问题,或者使用其他策略,例如MVCC(多版本并发控制)。

于 2013-10-24T18:47:28.507 回答