【问题标题】:MongoDB error on Transaction w/ ReadPreference Secondary on a test replica set测试副本集上带有 ReadPreference Secondary 的事务上的 MongoDB 错误
【发布时间】:2021-08-06 19:12:15
【问题描述】:

tl;dr 如何在测试副本集上对单操作读取事务启用读取首选项 SECONDARY?

我已经从 MongoDB deploy replica set for testing 创建了一个 MongoDB 副本集。

然后尝试从MongoDB Transactions 进行简单的单文档事务,我只更改了一些内容,例如将读取偏好设置为辅助。

# Step 1: Define the callback that specifies the sequence of operations to perform inside the transactions.
def callback(session):
    collection_one = session.client.mydb1.foo
    # Important:: You must pass the session to the operations.
    collection_one.find_one({'id': 0}, session=session)

# Step 2: Start a client session.
with client.start_session() as session:
    # Step 3: Use with_transaction to start a transaction, execute the callback, and commit (or abort on error).
    session.with_transaction(
        callback, read_concern=ReadConcern('snapshot'), # <- changed from 'local' to 'snapshot'
        write_concern=wc_majority,
        read_preference=ReadPreference.SECONDARY) # <- changed from PRIMARY to SECONDARY

我收到以下错误

...
pymongo.errors.InvalidOperation: read preference in a transaction must be primary, not: Secondary(tag_sets=None, max_staleness=-1, hedge=None)

如果我更改为阅读偏好 PRIMARY,它可以正常工作。 如果读取偏好必须是主要的,那么拥有这个选项根本没有任何意义......

我做错了什么或理解不正确?这似乎很基本,但 IMO 文档没有解释这一点。

【问题讨论】:

  • 您期望事务中的二次读取会有什么行为?
  • 我期望正常读取,即我从特定文档接收数据。只要是有效的读取,它就可以是过时的读取。我不再研究为什么事务不允许我从辅助读取。我相信问题可能来自收藏。不确定。

标签: python mongodb mongodb-replica-set


【解决方案1】:

事务中的二次读取没有意义。

事务正在当前主节点上运行。因此,读取将由主节点完成。请求二次读取与事务不兼容。

次要读取可以由任何次要执行。辅助节点可能有不同的数据。这使得简单的二次读取不可重复、不因果一致等。

如果您想要简单的二次读取,请不要在事务下发出它。

【讨论】:

  • 为什么在事务上有一个带有 SECONDARY 和 PREFERED_SECONDARY 的 readPreference 选项呢?如果使用它没有意义,那么拥有此功能就没有意义。您甚至可以使用rs.slaveOK() 命令在 mongo shell 上完成此操作(从辅助读取)。
  • 如果您询问 MongoDB 驱动程序或服务器文档的内容,请将相关文档的链接放入问题中。
  • 我已经更新了这个问题。 tl;dr 如何在测试副本集的单操作读取事务上启用读取首选项 SECONDARY?您的回答对我来说毫无意义,也许您是对的,我只需要了解为什么存在此功能(功能:在交易中读取偏好次要)但不能使用。
  • “事务中的次要读取偏好”不是一项功能,如错误消息所述。我不知道你为什么这么认为。
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2022-08-05
  • 2020-03-14
  • 2012-07-07
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多