王现岗
2026 年11 月 10 日 10:34
#1
【 使用环境 】测试环境
【 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操作不受更新阻塞,这是正常的吗,请老师帮忙看一下。是否有相关参数控制。
左手
2026 年11 月 10 日 10:54
#3
王现岗:
场景一
会话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操作不受更新阻塞,这是正常的吗,请老师帮忙看一下。是否有相关参数控制
场景一
会话A 的 update 语句已经 resolve 过 schema,正在执行
会话B rename 申请 MDL 写锁——如果 A 的语句执行时间极短,B 可能抢到锁(MDL 是瞬锁)
rename 完成后,schema 版本号发布,新旧表名映射关系翻转
会话A 原语句继续执行时,再次引用 T1 这个表名,但本地 schema 缓存已经失效 / 表名不存在
报 ORA-00942: table or view ‘HO.T1’ does not exist
这不是行锁冲突,是 schema 版本切换后,原语句找不到旧名字了。
在 Oracle 模式里表现为 ORA-00942,在 MySQL 模式里可能表现为 ERROR 1146 或语句重跑失败。这个属于正常
场景二
会话A 的 update 语句已经执行结束,只是事务没提交——它持有的是行锁 + 事务版本快照,不再持续占用表级读写
OB 判断“没有持续活跃事务”→ rename 可以拿到 MDL 写锁
rename 只改字典:把 T1 的表名改成 T2,底层 tablet/数据不动
会话A 的事务上下文里,已经绑定的是“那个物理表(tablet)”的修改,commit 时按事务版本号落盘,跟表名无关
所以 A 能 commit 成功;新连接查 T1 会报不存在,查 T2 能看到 A 改的数据(commit 后)
行锁保护的是“数据行”,MDL 保护的是“表定义”。两件事解耦。
这也是正常
王现岗
2026 年11 月 10 日 13:48
#4
未提交的时候会给表加RX意向更新锁,和MDL不是冲突吗 ,为啥还能拿到MDL锁
淇铭
2026 年11 月 10 日 13:53
#5
你好,你提的这个技术问题牵涉到OceanBase企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:
如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;
如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询 页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。
王现岗
2026 年11 月 10 日 16:54
#6
老师 社区版的A会话执行更新未完成 B会话执行rename会阻塞还是不会阻塞