diff --git a/cmdb-api/api/lib/decorator.py b/cmdb-api/api/lib/decorator.py index 185bd3c..26247e6 100644 --- a/cmdb-api/api/lib/decorator.py +++ b/cmdb-api/api/lib/decorator.py @@ -8,6 +8,7 @@ from flask import current_app from flask import request from sqlalchemy.exc import InvalidRequestError from sqlalchemy.exc import OperationalError +from sqlalchemy.exc import PendingRollbackError from sqlalchemy.exc import StatementError from api.extensions import db @@ -98,7 +99,10 @@ def reconnect_db(func): def _flush_db(): - db.session.commit() + try: + db.session.commit() + except (StatementError, OperationalError, InvalidRequestError, PendingRollbackError): + db.session.rollback() def flush_db(func): diff --git a/cmdb-api/api/lib/perm/acl/cache.py b/cmdb-api/api/lib/perm/acl/cache.py index bf45731..7204dca 100644 --- a/cmdb-api/api/lib/perm/acl/cache.py +++ b/cmdb-api/api/lib/perm/acl/cache.py @@ -4,7 +4,7 @@ import msgpack from api.extensions import cache -from api.extensions import db +from api.lib.decorator import flush_db from api.lib.utils import Lock from api.models.acl import App from api.models.acl import Permission @@ -221,9 +221,9 @@ class RoleRelationCache(object): return msgpack.loads(r_g, raw=False) @classmethod + @flush_db def rebuild(cls, rid, app_id): cls.clean(rid, app_id) - db.session.remove() cls.get_parent_ids(rid, app_id) cls.get_child_ids(rid, app_id) @@ -235,9 +235,9 @@ class RoleRelationCache(object): cls.get_resources2(rid, app_id) @classmethod + @flush_db def rebuild2(cls, rid, app_id): cache.delete(cls.PREFIX_RESOURCES2.format(rid, app_id)) - db.session.remove() cls.get_resources2(rid, app_id) @classmethod