【问题标题】:MongoDB transactions and readPreference optionMongoDB 事务和 readPreference 选项
【发布时间】:2022-08-05 01:15:50
【问题描述】:

有没有办法同时使用 MongoDB 多文档事务和readPreference=secondaryPreferred 选项?我的目标是什么:我有一些功能可以进行大量繁重的读取操作,并且我想通过在辅助副本上执行读取操作来减少主副本的负载。

MongoDB 文档说如果使用事务,readPreference 应该是主要的。所以我想知道如何将负载拆分为读取副本。有谁知道如何实现这一目标?

    标签: database mongodb transactions nosql


    【解决方案1】:

    没有办法做到这一点,因为事务只能在主节点中执行。在提交点之后,操作也会在辅助成员中复制。

    MongoDB 中的事务自动保证阅读你自己的作品单调读取(按设计)以确保良好的一致性。即使readPreference=secondaryPreferred 是可能的,这些属性也不会被授予,结果将是非常不可预测的。在 NoSQL DBMS 中实现事务(特别是 ACID 属性)的更安全方法是假装在单个实例数据库上工作。

    这并不意味着您不能拥有分布式事务(实际上它们存在于 MongoDB 中),但每个分片都需要一个单一的事实来源。


    正如@dododo 指出的那样,这是他们将来可能会放松的限制,如Driver Transactions Specification 中所述。

    【讨论】:

    • github.com/mongodb/specifications/blob/master/source/… 听起来可以避免这种限制,但据我所知,即使在高于 40 的服务器中它仍然存在
    • @dododo 有趣,谢谢。我仍然认为放松该限制太危险了,因为如果您尝试多次阅读同一行,您可能会阅读同一行的不同版本。再次感谢您的链接。
    • 谢谢。这就是我期望看到的。因此,看起来是实现我的目标的唯一方法 - 强制应用程序对辅助副本执行读取操作。
    【解决方案2】:

    据官方MongoDb Manual称,

    如果未设置事务级和会话级读取首选项,则事务使用客户端级读取首选项。默认情况下,客户端级别的读取首选项是主要的。

    包含读取操作的多文档事务必须使用主要读取首选项。给定事务中的所有操作必须路由到同一个成员。

    因此,对于您的问题,我能够在 mongo 配置中使用 TransactionOptions 更新事务的读取首选项。

    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
        TransactionOptions.builder().readPreference(com.mongodb.ReadPreference.primary()).build());
        return new MongoTransactionManager(dbFactory);
    }
    

    这对我有用。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多