OB 删除的锁为什么无法阻塞insert

OceanBase 的oracle租户模式下
当一个线程根据key删除表的一条数据时,另一个线程执行insert这个key的数据,insert语句未被阻塞,会直接报主键冲突,但如果是update这个key的数据,update语句会被阻塞,请问产生这样的原因是什么?OB的delete的锁的机制是什么,

3 个赞

@论坛小助手

1 个赞

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

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

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

另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。

2 个赞

可以参考这篇文档: 锁表-V4.3.5-OceanBase 数据库文档-分布式数据库使用文档

2 个赞

3 个赞

删除的 行锁 和 需要insert的数据 没关系吧。 即使你删除数据上锁 和 我 没insert 有什么关系呢 ?

1 个赞

主要是oracle里面,一条数据,根据主键,delete未提交前,insert执行时会被阻塞,但OB里面不会,但Ob的update就会阻塞,挺好奇这一点的

1 个赞

我测试了 ob 4.2.5.2 版本 oracle租户的表现。

  • 初始化数据
[admin@server61 ~]$ obclient -h10.0.0.62 -usys@oboracle -P2881 -paaAA11__ -c -A tpcc                                                                             
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 3221894399
Server version: OceanBase 4.2.5.2 (r102000122025011711-c08ae06f12ab4d54dc900d57df23148c0f761108) (Built Jan 17 2025 11:38:52)

Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient(SYS@oboracle)[TPCC]> create table t1(id number not null primary key,c1 varchar2(50));                                                                   
Query OK, 0 rows affected (0.416 sec)

obclient(SYS@oboracle)[TPCC]> insert into t1 values(1,'A');
Query OK, 1 row affected (0.059 sec)

obclient(SYS@oboracle)[TPCC]> insert into t1 values(2,'B');                                                                                                      
Query OK, 1 row affected (0.001 sec)

obclient(SYS@oboracle)[TPCC]> commit;
Query OK, 0 rows affected (0.002 sec)
  • 会话1 delete 不提交
obclient(SYS@oboracle)[TPCC]> delete from t1 where id=1;
Query OK, 1 row affected (0.006 sec)

obclient(SYS@oboracle)[TPCC]> 
  • 会话2 insert 等待锁,直到超时报错。
[root@server61 ~]# obclient -h10.0.0.62 -usys@oboracle -P2881 -paaAA11__ -c -A tpcc                                                                              
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 3221899620
Server version: OceanBase 4.2.5.2 (r102000122025011711-c08ae06f12ab4d54dc900d57df23148c0f761108) (Built Jan 17 2025 11:38:52)

Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient(SYS@oboracle)[TPCC]> select * from t1;
+------+------+
| ID   | C1   |
+------+------+
|    1 | A    |
|    2 | B    |
+------+------+
2 rows in set (0.011 sec)

obclient(SYS@oboracle)[TPCC]> insert into t1 values(1,'AA');
ORA-30006: resource busy; acquire with WAIT timeout expired
obclient(SYS@oboracle)[TPCC]> 

所以 delete 不提交是会阻塞另外一个会话的 insert ,OB(Oracle) 还是兼容 ORACLE 的。。 区别只是在原生的 oracle 里就一直这么耗着,ob 里语句有超时时间,会话2 等不及了就不等了。ob这么做可以减少一些不必要的阻塞。

更多阅读: 从ORACLE/MySQL到OceanBase:数据库超时机制

2 个赞

但是我这边测试结果对于两个会话分别执行先delete,后执行insert直接主键冲突
另外也看了ob_trx_lock_timeout 有设置很久的时间,所以现在很奇怪,到底是有什么原因或者什么参数在影响控制着这个?

1 个赞

你照着我的步骤 sql 贴你的 执行过程 看看。有些信息可能没有描述到位。 从连接开始,这样可以看版本信息。

1 个赞

我这边没法贴过程,不过执行步骤一样,结果如下:
版本: OceanBase 4.2.1.7
初始化数据和会话1执行的结果都一样;
会话2,查询也是一样的,
在执行insert后时,是直接提示 ORA-00001: unique constraint ‘1’ for key ‘T1_OBPK_1747727594760397’ violated

1 个赞

不知道是不是版本差异~~~
版本太多了,没有一一研究。不过 4.2.1 版本建议升级到 4.2.1.10 . 修复了不少bug,可以看官网release note。

1 个赞

:fist_right: :fist_right: :fist_right:

学习到了!!!

学到

学习总结经验 :+1: :+1: :+1:

学习了。