Transaction Error: sqlalchemy.exc.InvalidRequestError: Can’t operate on closed transaction inside context manager. Please complete the conte

用户运行 Dify 1.16.0-rc1 自托管版本(Docker部署),在向 /console/api/datasets/{dataset_id} 发送 PATCH 请求更新数据集(例如 ccf360ff-aa23-4010-99e7-f5213f7fe5dc )时,后端抛出该 sqlalchem

Transaction Error: sqlalchemy.exc.InvalidRequestError: Can't operate on closed transaction inside context manager. Please complete the conte

Transaction Error: sqlalchemy.exc.InvalidRequestError: Can’t operate on closed transaction inside context manager. Please complete the context manager before emitting further commands.

快速结论:此报错通常出现在 Dify 1.16.0-rc1 自托管(Docker)环境下,当用户对数据集进行 PATCH 操作(如更新数据集信息)时触发。优先排查服务层中是否有多余的 session.commit() 与控制器层 @with_session 装饰器冲突。

问题场景

用户运行 Dify 1.16.0-rc1 自托管版本(Docker部署),在向 /console/api/datasets/{dataset_id} 发送 PATCH 请求更新数据集(例如 ccf360ff-aa23-4010-99e7-f5213f7fe5dc)时,后端抛出该 sqlalchemy 事务错误。

报错原文

2026-07-17 08:23:13.196 ERROR [Dummy-23] [app.py:875] 089f55e7c7065e2dbfe921bfec1e29fa - Exception on /console/api/datasets/ccf360ff-aa23-4010-99e7-f5213f7fe5dc [PATCH]
Traceback (most recent call last):
  File "/app/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
  ...
  File "/app/api/libs/login.py", line 160, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
sqlalchemy.exc.InvalidRequestError: Can't operate on closed transaction inside context manager.  Please complete the context manager before emitting further commands.

原因分析

可能原因:在 dataset_service.py_update_internal_dataset() 方法中(第 815 行附近),存在一个 session.commit() 调用,该调用提前关闭了当前事务。但控制器层使用了 @with_session 上下文管理器,此装饰器本应在请求结束时统一提交。由于事务已被内部的 session.commit() 关闭,后续操作(如 session.refresh(dataset)_update_pipeline_knowledge_base_node_data())便会因试图操作已关闭的事务而失败。

此外,在 _update_external_dataset()(第 743 行)和 _update_pipeline_knowledge_base_node_data()(第 917 行)中也发现了类似的提前提交问题。

环境排查

  • Dify 版本:1.16.0-rc1
  • 部署方式:Self Hosted (Docker)
  • Python 版本:3.12(依据 traceback 中 .venv/lib/python3.12 判断)
  • 框架及依赖:Flask, Flask-RESTx, SQLAlchemy
  • 涉事文件:api/services/dataset_service.py

解决步骤

  1. 定位问题文件:打开 api/services/dataset_service.py
  2. 修改 _update_internal_dataset() 方法(约第 815 行):将内部的 session.commit() 替换为 session.flush()。使用 flush() 仅将更改发送到数据库但不提交事务,保留交给控制器层 @with_session 装饰器来统一提交。此解决方案为可优先尝试。
  3. 检查并修改其它方法:同样对 _update_external_dataset()(约第 743 行)和 _update_pipeline_knowledge_base_node_data()(约第 917 行)中的 session.commit() 执行同样的替换操作。
  4. 测试 PATCH 请求:修改后,重新发送 /console/api/datasets/{dataset_id} 的 PATCH 请求以验证。

验证方法

对目标 dataset_id 发起 PATCH 请求,确认不再收到 sqlalchemy.exc.InvalidRequestError,且服务器响应正常(不再报错)。

参考来源

langgenius/dify #39191

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 14580

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注