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 文档没有对此进行解释。
事务中的二次读取没有意义。
事务在当前主节点上 运行。因此,读取将由主节点完成。请求二次读取与事务不兼容。
二次读取可以由任何二次读取完成。二级可能有不同的数据。这使得简单的二次读取不可重复、因果不一致等
如果想要简单的二次读取,请不要在事务下发出。
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 文档没有对此进行解释。
事务中的二次读取没有意义。
事务在当前主节点上 运行。因此,读取将由主节点完成。请求二次读取与事务不兼容。
二次读取可以由任何二次读取完成。二级可能有不同的数据。这使得简单的二次读取不可重复、因果不一致等
如果想要简单的二次读取,请不要在事务下发出。