MongoDB 测试副本集上带有 ReadPreference Secondary 的事务出错

MongoDB error on Transaction w/ ReadPreference Secondary on a test replica set

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 文档没有对此进行解释。

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

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

二次读取可以由任何二次读取完成。二级可能有不同的数据。这使得简单的二次读取不可重复、因果不一致等

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