首批通过分布式安全可靠测评,为关键业务系统打造
长事务
更新时间:2026-04-10 11:58:35
长事务表示事务的执行时间超过一定的阈值(由应用层定义),并且未执行提交。这个阈值往往短于事务超时时间(由租户系统变量 ob_trx_timeout 控制,当事务执行时间超过到事务超时时间时,会自动回滚并释放资源),是应用层避免事务过长并占用系统资源的一种监控手段。
长事务/悬挂事务的危害:
- 活跃事务会持有 MemTable 的引用,如果事务长时间不结束,MemTable 冻结之后无法释放,可能导致内存写满。
- 活跃事务如持有行锁,会导致行锁得不到释放。其他事务在该行锁上等待,可能导致事务长时间等待,或事务超时回滚。
一旦发现长事务/悬挂事务的报警,需要立即确认原因,并及时排除风险。
可通过以下步骤排查。
捕获长事务。
可以通过系统租户下的
GV$OB_TRANSACTION_PARTICIPANTS视图查询长事务。如果存在长事务,获取到该事务的事务 ID(TX_ID)、scheduler 所在节点(SCHEDULER_ADDR)以及会话 ID(SESSION_ID)。SELECT count(1) FROM GV$OB_TRANSACTION_PARTICIPANTS WHERE CTX_CREATE_TIME < date_sub(now(), INTERVAL 600 SECOND) AND STATE = 'INIT';上例中的 600s 表示默认的事务超时时间,应用层可根据场景自行调整。
注意
事务巡检前需要确保系统中不存在无主的情况。
判断该事务是否为 XA 事务,使用事务 ID 作为筛选条件查询
V$OB_GLOBAL_TRANSACTION视图,存在记录即为 XA 事务。注意
XA 事务功能目前仅在 Oracle 租户下支持。因此,视图
V$OB_GLOBAL_TRANSACTION仅可以在对应的 Oracle 租户下查询。如果该事务为 XA 事务,在对应的用户租户下使用 xa rollback 回滚事务;如果该事务为普通事务,则可以通过 OBClient 直连该事务 scheduler 所在节点上的系统租户,通过 kill session 回滚该事务。
运维建议:
不建议设置太长的语句超时时间(租户系统变量 ob_query_timeout 默认 10s)和事务超时时间(租户系统变量 ob_trx_timeout 默认 100s),避免因为事务长时间不结束,影响系统稳定性。