From 660572a0eaa171b2bbf8ca04898ab3470309fded Mon Sep 17 00:00:00 2001 From: Bai Date: Fri, 19 Apr 2024 04:37:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20merge=5Fdelay=5Frun=20=E5=81=B6=E5=B0=94?= =?UTF-8?q?=E4=BC=9A=E5=87=BA=E7=8E=B0=20(2006,=20MySQL=20server=20has=20g?= =?UTF-8?q?one=20away=20=E7=9A=84=E6=8A=A5=E9=94=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/db/utils.py | 13 ++++++++++++- apps/common/decorators.py | 5 ++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/common/db/utils.py b/apps/common/db/utils.py index 69c82e583..e61db0bfd 100644 --- a/apps/common/db/utils.py +++ b/apps/common/db/utils.py @@ -1,6 +1,6 @@ from contextlib import contextmanager -from django.db import connections +from django.db import connections, transaction from django.utils.encoding import force_str from common.utils import get_logger, signer, crypto @@ -58,6 +58,17 @@ def safe_db_connection(): close_old_connections() +@contextmanager +def open_db_connection(alias='default'): + connection = transaction.get_connection(alias) + try: + connection.connect() + with transaction.atomic(): + yield connection + finally: + connection.close() + + class Encryptor: def __init__(self, value): self.value = force_str(value) diff --git a/apps/common/decorators.py b/apps/common/decorators.py index 171a4ff33..65a9cad07 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -12,6 +12,7 @@ from functools import wraps from django.db import transaction from .utils import logger +from .db.utils import open_db_connection def on_transaction_commit(func): @@ -146,7 +147,9 @@ ignore_err_exceptions = ( def _run_func_with_org(key, org, func, *args, **kwargs): from orgs.utils import set_current_org try: - with transaction.atomic(): + with open_db_connection() as conn: + # 保证执行时使用的是新的 connection 数据库连接 + # 避免出现 MySQL server has gone away 的情况 set_current_org(org) func(*args, **kwargs) except Exception as e: