由于会话事务集合丢失,因此无法保持事务状态

时间:2019-01-09 06:22:18

标签: python python-3.x mongodb transactions pymongo-3.x

我不小心从mongo数据库中删除了所有数据库。然后,我尝试在新数据库中插入文档。它将引发错误“由于缺少会话事务集合而无法保持事务状态。这表明config.transactions集合已被手动删除。”

我的示例代码:

doc_client = MongoClient(host=host,
                         port=port,
                         connect=True,  # Connect on first operation to avoid multi-threading related errors
                         j=True,  # Requests only return once write has hit the DB journal
                         )
print(doc_client.database_names()) # It works fine
doc_client['test'].insert({'a': 'ss'}) # Throws Error

1 个答案:

答案 0 :(得分:1)

  

我不小心从mongo数据库中删除了所有数据库

您可能已经删除了config.transactions个收藏夹。这是内部使用的集合,该集合存储用于支持副本集和分片群集的retryable writes的记录。另请参见Config Databases

自MongoDB v3.6 +起,用户将无法从mongo shell中删除副本集中的config数据库。尽管如果在v3.6之前使用mongo Shell进行连接,您仍然可以这样做,但是请确保升级Shell以使其与服务器版本匹配。

  

“由于缺少会话事务集合,因此无法保留事务状态。这表明config.transactions集合已被手动删除。”

您可以在主节点上手动重新创建集合:

use config
db.createCollection("transactions");

或者,副本集选择也会自动重新创建它。这是因为创建config.transactions集合是副本集节点提升的一部分。 session_catalog_mongod.cpp#L156

新的config.transactions集合将在主节点完成追赶阶段后复制到辅助节点。