行锁阻塞,在gv$ob_locks查不到被阻塞者信息,虚拟表__all_virtual_lock_wait_stat里面也为空

在oceanbase 4.3.4.1版本里,构建简单的行锁阻塞场景:
1.构建测试表:


create table tt(id number,name varchar(20));
insert into tt values(1,‘xxxxxx’),(2,‘yyyyyyy’),(3,‘zzzzz’);

2.开启一个新会话,会话1

3.再开启一个会话,会话2

4.查看gv$ob_locks


发现request都是NONE,并且block也没有1的记录

5.从系统租户里查看


__all_virtual_lock_wait_stat虚拟表里没有记录,
__all_virtual_trans_lock_stat虚拟表里有两条记录,代表持有两个行锁

2 个赞

你用的是ob的oracle模式么?

是的是的。不过mysql模式我也测试了,也不行

抱歉 oracle模式的建议找商业版客服经理 社区主要是开源mysql模式

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

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

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

我可以演示下mysql模式,mysql模式也不行。

那你重新发帖吧 一定是开源版的 mysql模式也有商业版的功能

测试结果同题主一样,只有一个锁的记录,没有原因详情

可以这样查询一下
select
/+QUERY_TIMEOUT(3600000000) read_consistency(weak) /
b.TRANS_ID,
case
WHEN b.TYPE = ‘TM’ THEN ‘表锁’
WHEN b.TYPE = ‘TX’ THEN ‘事务锁’
WHEN b.TYPE = ‘TR’ THEN ‘行锁’
ELSE NULL
END
AS lock_type,
ID1,
LMODE,
CASE
WHEN BLOCK = 0 THEN ‘该事务持有锁’
WHEN BLOCK = 1 THEN ‘该事务被阻塞’
ELSE NULL
END
as BLOCK,
a.SVR_IP,
ID,
user,
command,
time,
total_time,
STATE,
info,
retry_cnt,
retry_info,
thread_id,
trace_id
from
gv$ob_processlist a,
GV$OB_LOCKS b,
CDB_ob_table_locations c
where
a.trans_id = b.trans_id
and c.table_name = ‘表名称’
and (
ID1 like concat(’%’ , c.table_id, ‘%’)
OR ID1 like concat(’%’ , c.tablet_id ,’%’)
);

1 个赞

我也试试看去,之前也有类似疑问

学习