分布式事务悬挂导致全库行锁阻塞

银行核心系统采用 OceanBase 3.2.3 三副本集群,跑批期间大量跨分区转账事务。凌晨 03:12,一台 OBServer 因内存故障宕机,集群自动进行 Leader 切换。重启后,多个转账事务开始报错 ORA-02049: 事务锁超时,大量会话堆积,业务监控显示转账成功率跌至 40%,这个怎么解决

5 个赞

先通过 GV$OB_LOCK发现超过 200 个锁等待会话,等待对象为 accounts表的主键锁,持有者是一个已经被标记为NACTIVE的会话。查询 GV$OB_TRANSACTION_PARTICIPANTS发现该事务处于 PREPARE状态,且 Coordinator 正是宕机节点,属于典型的 悬挂事务。使用 ROLLBACK FORCE xid 强制回滚该悬挂事务,瞬间释放所有锁,业务恢复正常。 宕机节点是分布式事务的协调者,恢复时日志未完成回滚,导致事务参与者长时间停留在 Prepare 阶段未决。 OceanBase 默认的悬挂事务自动清理机制(xa_timeout默认 300s)尚未触发,导致锁持续阻塞其他事务。 想要永久修复他就调整内部参数 _xa_timeout 为 30s,让悬挂事务更快自动回滚。在应用层增加 `FOR UPDATE NOWAIT超时重试机制,避免连锁阻塞。建立故障自愈脚本:定时扫描 PREPARE状态超过 60 秒的事务并告警。

2 个赞

内容很好

1 个赞

可以杀吧

1 个赞

三副本集群,会出现这样的问题么,特别是在执行事务时,突然有一台observer宕机的时候

1 个赞

你好,你提的这个技术问题牵涉到OceanBase企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:

  1. 如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;

  2. 如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。

另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。

1 个赞

学习