修复:服务详情接口浏览量自增异步任务导致SQLAlchemy会话状态冲突

- 根本原因:使用asyncio.create_task在后台执行db.commit(),主请求结束时调用db.close()导致会话状态冲突
- 错误:Method 'close()' can't be called here; method 'commit()' is already in progress
- 修复:改为同步执行浏览量自增和浏览历史记录,避免异步任务与会话生命周期冲突
This commit is contained in:
Pine
2026-09-05 16:45:09 +08:00
parent 9f1370dfe6
commit 7cfc0163e0
+23 -26
View File
@@ -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 = """