热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PyMongo事务错误:仅在副本集成员或mongos上允许事务编号

如何解决《PyMongo事务错误:仅在副本集成员或mongos上允许事务编号》经验,为你挑选了1个好方法。

当我使用pymongo 3.7事务功能连接到mongo服务器4.0时,出现此错误"只允许在副本集成员或mongos上使用交易号",我找不到任何解决此问题的答案.我的代码是:

from pymongo import MongoClient
cOnn= MongoClient(host, port)
tb = conn.collector_gateway.try_table
with conn.start_session() as session:
    with session.start_transaction():
        tb.insert_one({"sku": "abc123", "qty": 100}, session=session)

错误是:

Traceback (most recent call last):
  File "/Users/yuzgu/PycharmProjects/seller_loss_alert/try_mongo.py", line 22, in 
    tb.insert_one({"sku": "abc123", "qty": 100}, session=session)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/collection.py", line 693, in insert_one
    session=session),
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/collection.py", line 607, in _insert
    bypass_doc_val, session)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/collection.py", line 595, in _insert_one
    acknowledged, _insert_command, session)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1243, in _retryable_write
    return self._retry_with_session(retryable, func, s, None)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1196, in _retry_with_session
    return func(session, sock_info, retryable)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/collection.py", line 590, in _insert_command
    retryable_write=retryable_write)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/pool.py", line 579, in command
    unacknowledged=unacknowledged)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/network.py", line 150, in command
    parse_write_concern_error=parse_write_concern_error)
  File "/Users/yuzgu/anaconda3/lib/python3.6/site-packages/pymongo/helpers.py", line 155, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: Transaction numbers are only allowed on a replica set member or mongos

由于mongo交易功能已于今年发布,我找不到解决方案,任何人都可以帮我解决这个问题吗?



1> kevinadi..:

事务仅在副本集设置(https://docs.mongodb.com/master/core/transactions/#transactions-and-replica-sets)中可用:

多文档事务仅适用于副本集。

当您尝试在独立mongod实例上执行事务操作时,将显示此错误消息。

请参阅“ 交易”页面以了解更多详细信息和要求。


由于在单个节点上进行多文档事务很简单,为什么MongoDB不允许这样做?MongoDB的优点之一一直是,使基本系统正常工作非常容易-但现在使用事务(一项核心功能)需要额外的步骤来建立副本集-当然,因此也会产生其他问题(例如rs.initiate( )将localhost作为其主机名放在我的docker容器中,然后客户端在读取成员列表后无法连接到它...)
出于开发目的,可以从一个节点启动副本集。启动一个mongod -replSet ,然后在mongo shell中执行rs.initiate()。请注意,这不是为生产环境推荐的设置。
谢谢。我在stackoverflow上看到了您的个人资料,并且知道您在MongoDb中工作。出于好奇,为什么MongoDb不向独立的mongod实例开放此功能?对于用户来说,这似乎是一种常见的情况。
推荐阅读
author-avatar
梦天使悠然
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有