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:
parent
d0d3e1b24c
commit
06b9762d4d
@ -240,6 +240,12 @@ class DBPools(EventDispatcher):
|
|||||||
yield sqlor
|
yield sqlor
|
||||||
if sqlor and sqlor.dataChanged:
|
if sqlor and sqlor.dataChanged:
|
||||||
await sqlor.commit()
|
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:
|
except BaseException as e:
|
||||||
self.e_except = e
|
self.e_except = e
|
||||||
if not isinstance(e, asyncio.CancelledError):
|
if not isinstance(e, asyncio.CancelledError):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user