diff --git a/api/services/credit_pool_service.py b/api/services/credit_pool_service.py index 2894826935..35c2c9f688 100644 --- a/api/services/credit_pool_service.py +++ b/api/services/credit_pool_service.py @@ -1,7 +1,7 @@ import logging -from sqlalchemy import update -from sqlalchemy.orm import Session +from sqlalchemy import select, update +from sqlalchemy.orm import Session, sessionmaker from configs import dify_config from core.errors.error import QuotaExceededError @@ -29,14 +29,15 @@ class CreditPoolService: @classmethod def get_pool(cls, tenant_id: str, pool_type: str = "trial") -> TenantCreditPool | None: """get tenant credit pool""" - return ( - db.session.query(TenantCreditPool) - .filter_by( - tenant_id=tenant_id, - pool_type=pool_type, + with sessionmaker(db.engine, expire_on_commit=False).begin() as session: + return session.scalar( + select(TenantCreditPool) + .where( + TenantCreditPool.tenant_id == tenant_id, + TenantCreditPool.pool_type == pool_type, + ) + .limit(1) ) - .first() - ) @classmethod def check_credits_available( diff --git a/api/tasks/async_workflow_tasks.py b/api/tasks/async_workflow_tasks.py index d247cf5cf7..f8f87914ff 100644 --- a/api/tasks/async_workflow_tasks.py +++ b/api/tasks/async_workflow_tasks.py @@ -156,7 +156,12 @@ def _execute_workflow_common( state_owner_user_id=workflow.created_by, ) - # Execute the workflow with the trigger type + # NOTE (hj24) + # Release the transaction before the blocking generate() call, + # otherwise the connection stays "idle in transaction" for hours. + session.commit() + # NOTE END + generator.generate( app_model=app_model, workflow=workflow,