【发布时间】:2018-08-08 21:45:50
【问题描述】:
我正在使用 GridFS 在我的数据库中存储一些视频文件。我已经更新到 MongoDB 4.0 并尝试使用多集合事务模型。我面临的问题是put() 命令gridfs 挂起系统。我的使用方式如下:
client = pymongo.MongoClient(mongo_url)
db = client[db_name]
fs = gridfs.GridFS(db)
现在我尝试使用如下事务模型:
with db.client.start_session() as session:
try:
file_path = "video.mp4"
session.start_transaction()
with open(file_path, 'rb') as f:
fid = self.fs.put(f, metadata={'sequence_id': '0001'})
session.commit_transaction()
except Exception as e:
raise
finally:
session.end_session()
问题是put 命令挂起大约一分钟。然后它返回但提交失败。我有一种感觉,这是因为会话对象没有传递给put 命令,但我在帮助中没有看到任何将会话作为输入的参数。挂起后,测试失败,堆栈如下:
Traceback(最近一次调用最后一次):
session.commit_transaction()
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/client_session.py", line 393, in commit_transaction
self._finish_transaction_with_retry("commitTransaction")
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/client_session.py", line 457, in _finish_transaction_with_retry
return self._finish_transaction(command_name)
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/client_session.py", line 452, in _finish_transaction
parse_write_concern_error=True)
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/database.py", line 514, in _command
client=self.__client)
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/pool.py", line 579, in command
unacknowledged=unacknowledged)
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/network.py", line 150, in command
parse_write_concern_error=parse_write_concern_error)
File "/Users/xargon/anaconda/envs/deep/lib/python3.6/site-packages/pymongo/helpers.py", line 155, in _check_command_response
raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: Transaction 1 has been aborted.
编辑
我尝试将 put 块替换为:
try:
gf = self.fs.new_file(metadata={'sequence_id': '0000'})
gf.write(f)
finally:
gf.close()
但是,gf.close() 再次发生挂起
我还尝试直接实例化GridIn,以便我可以提供会话对象,但失败为:
gin = gridfs.GridIn(root_collection=self.db["fs.files"], session=session)
gin.write(f)
gin.close()
此操作失败并显示错误消息:
It is illegal to provide a txnNumber for command createIndexes
【问题讨论】:
标签: mongodb transactions pymongo gridfs