咨询一下oracle模式租户下,rename表操作的原理

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】V4.2.1.10 4.2.1.11
【问题描述】
场景一
会话A执行update t1 set id = ‘1’ where name = ‘’;
在会话A执行过程中,会话B执行 alter table t1 rename to t2; 可以执行成功
会话A报错 ORA-00942: table or view ‘HO.T1’ does not exist

场景二
会话A执行update t1 set id = ‘1’ where name = ‘’; 执行完成后不提交
会话B执行 alter table t1 rename to t2; 可以执行成功
会话A执行commit 成功

从现象看,rename操作不受更新阻塞,这是正常的吗,请老师帮忙看一下。是否有相关参数控制。

场景一

  1. 会话A 的 update 语句已经 resolve 过 schema,正在执行

  2. 会话B rename 申请 MDL 写锁——如果 A 的语句执行时间极短,B 可能抢到锁(MDL 是瞬锁)

  3. rename 完成后,schema 版本号发布,新旧表名映射关系翻转

  4. 会话A 原语句继续执行时,再次引用 T1 这个表名,但本地 schema 缓存已经失效 / 表名不存在

  5. 报 ORA-00942: table or view ‘HO.T1’ does not exist

这不是行锁冲突,是 schema 版本切换后,原语句找不到旧名字了。

在 Oracle 模式里表现为 ORA-00942,在 MySQL 模式里可能表现为 ERROR 1146 或语句重跑失败。这个属于正常
场景二

  1. 会话A 的 update 语句已经执行结束,只是事务没提交——它持有的是行锁 + 事务版本快照,不再持续占用表级读写

  2. OB 判断“没有持续活跃事务”→ rename 可以拿到 MDL 写锁

  3. rename 只改字典:把 T1 的表名改成 T2,底层 tablet/数据不动

  4. 会话A 的事务上下文里,已经绑定的是“那个物理表(tablet)”的修改,commit 时按事务版本号落盘,跟表名无关

  5. 所以 A 能 commit 成功;新连接查 T1 会报不存在,查 T2 能看到 A 改的数据(commit 后)

行锁保护的是“数据行”,MDL 保护的是“表定义”。两件事解耦。
这也是正常

未提交的时候会给表加RX意向更新锁,和MDL不是冲突吗 ,为啥还能拿到MDL锁

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

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

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

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

老师 社区版的A会话执行更新未完成 B会话执行rename会阻塞还是不会阻塞