可以通过 ob_trx_lock_timeout 变量设置事务的等锁超时时长。
适用版本
OceanBase 数据库 V2.2.7x 版本
trx_try_wait_lock_timeout
trx_try_wait_lock_timeout 是集群配置项,用于设置语句执行过程中行锁的等待时长,取值范围为 [0, 100 ms] ,默认为 0。
trx_try_wait_lock_timeout≠0 时,表示当 SQL 执行过程中遇到锁冲突,会占据本线程指定时长的等待时间,如果该时间内没有等到锁释放,就将该 SQL 返回大查询队列,这种策略在重试时可能仍然会遇到锁冲突。对于多热点行的场景,一个事务解锁后,等待锁的事务要继续排队,队列前排的事务可能在等其它的热点行,这些热点行可能还没释放行锁,这样就陷入了循环等待。
trx_try_wait_lock_timeout=0 时,OecanBase 数据库引入了 lock wait mgr,当遇到锁冲突的时候,请求进入 lock wait mgr 等待,当解行锁的时候,检查 lock wait mgr 中是否有请求在等这一行的行锁,如果有等待的请求,就唤醒一个加入到工作队列。
配置请求锁超时时间
可以通过 ob_trx_lock_timeout 变量设置事务的等锁超时时长。该变量为租户级变量,单位为微秒,取值范围为 [0, +∞),默认为 -1。
系统会按照如下逻辑判断行锁冲突的等待时间:
当
ob_trx_lock_timeout为默认值 -1 时,行锁冲突的等待时间为ob_query_timeout的值。当
ob_trx_lock_timeout为非 -1 值时,行锁冲突等待时间为ob_trx_lock_timeout与ob_query_timeout中的较小值。
该变量不建议设置过大,因为这样会导致在该时间范围内不断重试请求锁。