From 7cfc0163e004bfb6453b628ef6d56a8f5f17d248 Mon Sep 17 00:00:00 2001 From: Pine Date: Sat, 5 Sep 2026 16:45:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=E6=B5=8F=E8=A7=88=E9=87=8F?= =?UTF-8?q?=E8=87=AA=E5=A2=9E=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1=E5=AF=BC?= =?UTF-8?q?=E8=87=B4SQLAlchemy=E4=BC=9A=E8=AF=9D=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根本原因:使用asyncio.create_task在后台执行db.commit(),主请求结束时调用db.close()导致会话状态冲突 - 错误:Method 'close()' can't be called here; method 'commit()' is already in progress - 修复:改为同步执行浏览量自增和浏览历史记录,避免异步任务与会话生命周期冲突 --- app/api/routers/rbac_service_market.py | 49 ++++++++++++-------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/app/api/routers/rbac_service_market.py b/app/api/routers/rbac_service_market.py index a02925d..eb7b9f3 100644 --- a/app/api/routers/rbac_service_market.py +++ b/app/api/routers/rbac_service_market.py @@ -192,32 +192,29 @@ async def service_detail( item["gallery"] = _parse_json(item.get("gallery_json"), []) item["skus"] = _parse_json(item.get("skus_json"), []) - # 浏览量自增(异步,不阻塞响应) - import asyncio - async def _incr_view(): - try: - await db.session.execute( - text("UPDATE opc_services SET view_count = view_count + 1 WHERE id = :id"), - {"id": service_id}, - ) - await db.session.commit() - # 记录浏览历史 - await db.session.execute( - text("""INSERT INTO service_views (id, service_id, user_id, ip, user_agent, created_at) - VALUES (:id, :service_id, :user_id, :ip, :ua, :now)"""), - { - "id": _gen_id("sv_"), - "service_id": service_id, - "user_id": user.get("id", "") if user else "", - "ip": "", - "ua": "", - "now": _now(), - }, - ) - await db.session.commit() - except Exception: - pass - asyncio.create_task(_incr_view()) + # 浏览量自增(同步执行,避免异步任务导致会话状态冲突) + try: + await db.session.execute( + text("UPDATE opc_services SET view_count = view_count + 1 WHERE id = :id"), + {"id": service_id}, + ) + await db.session.commit() + # 记录浏览历史 + await db.session.execute( + text("""INSERT INTO service_views (id, service_id, user_id, ip, user_agent, created_at) + VALUES (:id, :service_id, :user_id, :ip, :ua, :now)"""), + { + "id": _gen_id("sv_"), + "service_id": service_id, + "user_id": user.get("id", "") if user else "", + "ip": "", + "ua": "", + "now": _now(), + }, + ) + await db.session.commit() + except Exception: + pass # 评价统计 review_sql = """