From 06b9762d4d6eddd0bf82a96df4090db86b4802b8 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 18 Aug 2026 11:11:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20sqlorContext=20SELECT-only=20=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E9=80=80=E5=87=BA=E6=97=B6=20rollback=EF=BC=8C?= =?UTF-8?q?=E9=87=8A=E6=94=BE=20MDL=20=E9=94=81=E9=98=B2=20poller=20?= =?UTF-8?q?=E5=81=9C=E6=91=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SELECT-only 的 context 退出时既不 commit 也不 rollback,连接回池后事务未提交, 持有 MDL_SHARED 锁 + MVCC 快照。累积的未提交事务阻塞后续 DDL/元数据操作, 而 lock_wait_timeout 默认 86400(24h),可卡死 poller 达数小时(2026-08 生产事故:poller 停摆 15.7h)。 --- sqlor/dbpools.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sqlor/dbpools.py b/sqlor/dbpools.py index c9c0508..71c3166 100644 --- a/sqlor/dbpools.py +++ b/sqlor/dbpools.py @@ -240,6 +240,12 @@ class DBPools(EventDispatcher): yield sqlor if sqlor and sqlor.dataChanged: await sqlor.commit() + else: + # SELECT-only 事务也要结束:rollback 释放 MDL 锁和 MVCC 快照。 + # 否则连接回池后事务未提交,持有 MDL_SHARED 阻塞后续 DDL/元数据操作, + # 而 lock_wait_timeout 默认 86400(24h),可卡死 poller 达数小时。 + # (2026-08 生产事故:poller 停摆 15.7h,根因即此) + await sqlor.rollback() except BaseException as e: self.e_except = e if not isinstance(e, asyncio.CancelledError):