fix: sqlorContext SELECT-only 事务退出时 rollback,释放 MDL 锁防 poller 停摆

SELECT-only 的 context 退出时既不 commit 也不 rollback,连接回池后事务未提交,
持有 MDL_SHARED 锁 + MVCC 快照。累积的未提交事务阻塞后续 DDL/元数据操作,
而 lock_wait_timeout 默认 86400(24h),可卡死 poller 达数小时(2026-08 生产事故:poller 停摆 15.7h)。
This commit is contained in:
yumoqing 2026-08-18 11:11:26 +08:00
parent d0d3e1b24c
commit 06b9762d4d

View File

@ -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):