问题现象
OceanBase 数据库集群的 DML 在执行期间出现如下状态,trans_state 为 TIMEOUT,但是 DML 语句依然处于 ACTIVE 状态。

尝试 kill session 后,DML 语句状态处于 SESSION_KILLED 状态,依然无法停止。

关键日志信息如下。
## 如果 retry_count 过大,说明在持续重试
[2025-02-28 01:13:30.684019] WARN [STORAGE.TRANS] wait_end_stmt (ob_trans_sche_ctx.cpp:1272) [104187][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=15] [dc=0] wait end stmt fail, need retry(retry_count=965, *this={ObDistTransCtx:{ObTransCtx:{this:0x7fb04dad04c0, ctx_type:0, trans_id:{hash:13269896117768421679, inc:8134285364, addr:"12.64.3.133:2882", t:1740675800579456}, tenant_id:1018, is_exiting:false, trans_type:2, is_readonly:false, trans_expired_time:1740676400568023, self:{tid:1000, partition_id:1000, part_cnt:1000}, state:{prepare_version:-1, state:3}, cluster_version:12885033730, trans_need_wait_wrap:{receive_gts_ts:{mts:0}, need_wait_interval_us:0}, trans_param:[access_mode=1, type=3, isolation=1, magic=17361641481138401520, autocommit=1, consistency_type=0(CURRENT_READ), read_snapshot_type=1(STATEMENT_SNAPSHOT), cluster_version=12885033730, is_inner_trans=0], can_elr:false, uref:1073741824, ctx_create_time:1740676404082044, for_replay:false}, scheduler:"12.64.3.133:2882", coordinator:{tid:18446744073709551615, partition_id:-1, part_idx:268435455, subpart_idx:268435455}, participants:[], request_id:1740676404082044, timeout_task:{is_inited:true, is_registered:false, is_running:false, delay:0, ctx:0x7fb04dad04c0, bucket_idx:-1, run_ticket:0, is_scheduled:false, prev:null, next:null}, xid:{gtrid_str:"", bqual_str:"", format_id:1, gtrid_str_.ptr():"data_size:0, data:", bqual_str_.ptr():"data_size:0, data:"}}, state:{prepare_version:-1, state:3}, seq_no:1740676404081477, is_rollback:true, session_id:3223795776, proxy_session_id:882988428059465775, cluster_id:100314, commit_times:0, is_tenant_active:true, app_trace_id_str:"", is_gts_waiting:false, can_elr:false, savepoint_seq_no:1740675800579457, is_xa_end_trans:false, is_xa_readonly:false, xa_trans_state:0, xa_branch_count:0, xa_ref_count:0, is_tightly_coupled:true, lock_xid:{gtrid_str:"", bqual_str:"", format_id:1, gtrid_str_.ptr():"data_size:0, data:", bqual_str_.ptr():"data_size:0, data:"}, is_terminated:false, stmt_rollback_req_timeout:3000000})
问题原因
该问题为 OceanBase 缺陷,当 ob_query_timeout 大于 ob_trx_timeout 时,该缺陷会导致事务超时后,DML 语句依然无法停止且一直重试直到 DML 执行完成或 ob_query_timeout 超时退出。
问题的风险及影响
问题本身无直接影响,可能会间接影响 GC、SCHEMA 相关模块。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
解决方法
重启 SQL 运行的异常节点即可恢复。
规避方式
设置
ob_query_timeout小于ob_trx_timeout。升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP8 Hotfix5(oceanbase-3.2.3.3-108050012023070409)及之后版本。