我是MongoDB的新手,作为一个学习练习,我正在使用MongoDB中的Java开发一个图书馆管理系统。我遇到的问题是,如何在以下场景中确保事务属性:
我有一个Book类和一个Author类,它们具有多对多的关系。现在,当我保存一本特定的书时,它可能有多位作者。我首先保存/更新作者,包括生成的书籍ID,然后我使用作者ID保存Book类。现在,如何确保此多文档保存遵循事务属性?
通过以前的帖子搜索我在MongoDB网站上得到了Two Phase Commit plan,但我不清楚如何在我的应用程序中使用该方法。
直到现在,我已经通过文件的影子备份制作了“回滚”和“提交”替代方案,但从长远来看,这是不可行的,因为它使数据库大小加倍。另外,我想知道为什么MongoDB没有内置方法来处理事务。
答案 0 :(得分:1)
我想知道为什么MongoDB没有内置方法来处理事务。
交易很难。我认为有三个论点可以解释为什么没有它们就可以生存:
在SQL中,事务非常重要,因为您正在分解对象。发票在SQL中没有行项目,但行项目引用了发票。因此,部分提交可能会导致发票中缺少一半的订单项(但一切显然都有效)。由于MongoDB支持嵌入,因此您不需要拆分所有对象,并且对连接和事务的需求要小得多(尽管通常要小心嵌入)。
< / LI>数据库事务很好,但是需要业务事务是很常见的,即需要等待API调用,用户交互等的更长时间的运行操作。这个逻辑,包括回滚此类事务的逻辑必须在应用程序代码中处理。
可伸缩性:单个计算机上的事务很棘手,但在分片和复制环境中它们是残酷的。你必须有一个位于某个地方的事务协调器,等待一切都完成并返回或最终调用它退出并发送回滚。现在想象有一个网络分区或者事务协调器发生故障......所有这些都难以实现并且咀嚼性能。它还隐藏了开发人员的严重复杂性。同样,最好在应用程序代码中处理此问题,或使用其他策略,例如MVCC(多版本并发控制)。