为什么等待行锁的session,在GV$SESSION_WAIT查不到

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】oceanbase v4.2
【问题描述】通过2个session 制造行锁等待,想通过GV$SESSION_WAIT查看会话等待信息,却查不到。
步骤1 :
会话1 sid为 387471 执行UPDATE语句
obclient(OBTEST@obpaydb)[OBTEST]> select userenv(‘sid’) from dual;
±---------------+
| USERENV(‘SID’) |
±---------------+
| 387471 |
±---------------+
1 row in set (0.002 sec)

obclient(OBTEST@obpaydb)[OBTEST]> update test set name=‘kk’ where id=3;
Query OK, 1 row affected (0.173 sec)
Rows matched: 1 Changed: 1 Warnings: 0

步骤2:
会话2 sid 为 315774 执行update语句
obclient(OBTEST@obpaydb)[OBTEST]> select userenv(‘sid’) from dual;
±---------------+
| USERENV(‘SID’) |
±---------------+
| 315774 |
±---------------+
1 row in set (0.001 sec)

obclient(OBTEST@obpaydb)[OBTEST]> update test set name=‘kk’ where id=3;
–此处会话等待会话1行锁

通过gv$ob_processlist,gv$ob_transaction_participants,gv$ob_locks可以查看到sid 387471会话 的session id为3221865089 SID 为315774 的session id为3221865754

我想通过GV$SESSION_WAIT 查看会话等待事件:
obclient(root@sys)[oceanbase]> select * from GV$SESSION_WAIT where sid in (387471 ,315774 ,3221865089 ,3221865754);
Empty set (0.023 sec)
结果集为空,通过state 为waiting状态过滤得到如下结果:
obclient(root@sys)[oceanbase]> select * from GV$SESSION_WAIT where state =‘WAITING’;
±--------------±-------±-------------±---------±---------------------±---------------±--------±-------±-----±-------±-----±--------------±------------±-----------±--------±------------------±---------------------±---------------------------+
| SID | CON_ID | SVR_IP | SVR_PORT | EVENT | P1TEXT | P1 | P2TEXT | P2 | P3TEXT | P3 | WAIT_CLASS_ID | WAIT_CLASS# | WAIT_CLASS | STATE | WAIT_TIME_MICRO | TIME_REMAINING_MICRO | TIME_SINCE_LAST_WAIT_MICRO |
±--------------±-------±-------------±---------±---------------------±---------------±--------±-------±-----±-------±-----±--------------±------------±-----------±--------±------------------±---------------------±---------------------------+
| 678604832768 | 1 | 172.30.60.11 | 2882 | db file compact read | fd | 14397 | offset | 0 | size | 0 | 109 | 9 | SYSTEM_IO | WAITING | -5548232102978607 | 5548232112978607 | 0 |
| 747324309504 | 1 | 172.30.60.11 | 2882 | sleep wait | sleep_interval | 200000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | -5548232089096477 | -1 | 0 |
| 1842540969984 | 1 | 172.30.60.11 | 2882 | sleep wait | sleep_interval | 1000000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | -5548231100980633 | -1 | 0 |
| 2787433775104 | 1001 | 172.30.60.11 | 2882 | sleep wait | sleep_interval | 1000000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | -5548231077933536 | -1 | 0 |
| 5841155522560 | 1002 | 172.30.60.11 | 2882 | sleep wait | sleep_interval | 1000000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | -5548230273385839 | -1 | 0 |
| 747324309504 | 1 | 172.30.60.41 | 2882 | sleep wait | sleep_interval | 200000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | -6156173939607750 | -1 | 0 |
| 747324309504 | 1 | 172.30.60.21 | 2882 | sleep wait | sleep_interval | 200000 | | 0 | | 0 | 106 | 6 | IDLE | WAITING | 209522726861692 | -1 | 0 |
±--------------±-------±-------------±---------±---------------------±---------------±--------±-------±-----±-------±-----±--------------±------------±-----------±--------±------------------±---------------------±---------------------------+
也没有发现行锁等待的会话,不知道为什么,是ob这块有什么bug吗

select userenv(‘sid’) from dual;
你这个事oracle模式的用法吧?

1 个赞

OB 需要查 gv$ob_locks,oracle的查询方式不适用OB

2 个赞

但是我看官方文档写了GV$SESSION_WAIT 常见的等待事件有行锁等待

1 个赞

是的

1 个赞

我觉得既然发生了会话等待,无论等待什么 比如行锁,也应该在GV$SESSION_WAIT中体现出来吧 ,ORACLE在v$session中体现的TX-row嘛 ,但是我在oB上通过GV$SESSION_WAIT查不到等待行锁等待的session

1 个赞

我上次测试死锁 , 查看这个表 也没有 。 我的是社区版 4.3的 mysql模式。
我从gv$ob_locks 查询出来锁信息。 就没往下刨低。

2 个赞

对 我觉得 如果这样 oB这么设计不合理 我们排查问题 应该先从这个视图查出会话等待什么 ,才能去排查其他原因比如锁

1 个赞

oracle模式建议去咨询商业技术支持。
1.如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;
2.如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
OceanBase官网商务咨询
https://www.oceanbase.com/contactus?fromPage=https%3A%2F%2Fwww.oceanbase.com%2Fsoftwarecenter-enterprise&dataSources=softwarecenter-enterprise_footercontact_d2022

查哪个视图,OB说了算 :crazy_face:

1 个赞