【 使用环境 】测试环境
【 使用版本 】4.2.5.6 mysql租户
【问题描述】:
开两个独立事务,执行以下sql时,事务A可查询获取一条数据不提交,事务B返回空;查询oceanbase.__all_virtual_trans_lock_stat和oceanbase.gv$ob_locks t后发现该sql确实只锁了一行;执行explain后的结果看也不是锁定全表或者锁定所有满足条件的行,从结果来看像是“命中第一条被锁记录 → 直接返回空”而不是跳过被锁的记录继续查询
sql信息:SELECT busi_seq_num
FROM xxx
WHERE
a= xx
AND b= xx
AND c= xx
AND d =xx
ORDER BY busi_seq_num
LIMIT 1
FOR UPDATE SKIP LOCKED;
【复现路径】:开启事务A执行sql有一行结果,开启事务B执行sql无结果
【附件及日志】
sql执行结果:
busi_seq_num|
------------+
106200106 |
__all_virtual_trans_lock_stat记录
tenant_id|trans_id |svr_ip |svr_port|ls_id|table_id|tablet_id|rowkey |session_id|proxy_session_id|ctx_create_time |expired_time |time_after_recv|row_lock_addr|
---------+---------+-----------+--------+-----+--------+---------+-------------------------------------------------------------------------------------------------------------------------------+----------+----------------+-----------------------+-----------------------+---------------+-------------+
1004|216002021|10.22.4.126| 2882| 1001| 0| 215506|{"VARCHAR":"SG", collation:"utf8mb4_unicode_ci"},{"VARCHAR":"SA1", collation:"utf8mb4_unicode_ci"},{"VARCHAR":"106200106", coll|3221616080| |2026-02-02 18:28:57.181|2026-02-03 18:28:54.656| 10539161| 0|
gv$ob_locks t数据:
SVR_IP |SVR_PORT|TENANT_ID|TRANS_ID |SESSION_ID|TYPE|ID1 |ID2 |ID3 |LMODE|REQUEST|CTIME |BLOCK|
-----------+--------+---------+---------+----------+----+---------+----------+--------------------------------------------------------------------------------------------------------------------------------------+-----+-------+---------+-----+
10.22.4.126| 2882| 1004|216002021|3221616080|TR |216002021|3221616080|215506-{"VARCHAR":"SG", collation:"utf8mb4_unicode_ci"},{"VARCHAR":"SA1", collation:"utf8mb4_unicode_ci"},{"VARCHAR":"106200106", coll|X |NONE |158599784| 0|
10.22.4.126| 2882| 1004|216002021|3221616080|TX |216002021|3221616080| |X |NONE |158603562| 0|
10.22.4.126| 2882| 1004|216002021|3221616080|TM |216002021|3221616080|215506 |RX |NONE |158607522| 0|`预先格式化的文本`