OceanBase 的oracle租户模式下
当一个线程根据key删除表的一条数据时,另一个线程执行insert这个key的数据,insert语句未被阻塞,会直接报主键冲突,但如果是update这个key的数据,update语句会被阻塞,请问产生这样的原因是什么?OB的delete的锁的机制是什么,
您好,您提的这个技术问题可能牵涉到 OceanBase 企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:
-
如你所在的企业客户已签署 OceanBase 企业版销售合同,请你联系客户经理;
-
如你所在的企业客户尚未签署 OceanBase 企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。
删除的 行锁 和 需要insert的数据 没关系吧。 即使你删除数据上锁 和 我 没insert 有什么关系呢 ?
主要是oracle里面,一条数据,根据主键,delete未提交前,insert执行时会被阻塞,但OB里面不会,但Ob的update就会阻塞,挺好奇这一点的
我测试了 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这么做可以减少一些不必要的阻塞。
但是我这边测试结果对于两个会话分别执行先delete,后执行insert直接主键冲突
另外也看了ob_trx_lock_timeout 有设置很久的时间,所以现在很奇怪,到底是有什么原因或者什么参数在影响控制着这个?
你照着我的步骤 sql 贴你的 执行过程 看看。有些信息可能没有描述到位。 从连接开始,这样可以看版本信息。
我这边没法贴过程,不过执行步骤一样,结果如下:
版本: OceanBase 4.2.1.7
初始化数据和会话1执行的结果都一样;
会话2,查询也是一样的,
在执行insert后时,是直接提示 ORA-00001: unique constraint ‘1’ for key ‘T1_OBPK_1747727594760397’ violated
不知道是不是版本差异~~~
版本太多了,没有一一研究。不过 4.2.1 版本建议升级到 4.2.1.10 . 修复了不少bug,可以看官网release note。
学习到了!!!
学到
学习总结经验
学习了。