首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 租户使用 rowid 做为条件进行重复更新数据,第二次没有更新到数据的原因和解决方法
更新时间:2026-05-28 02:06
问题现象
OceanBase 租户 update 数据,使用 rowid 做为唯一条件进行更新数据,第一次更新一条数据,第二次更新 0 行数据的。
测试复现,示例如下。
-- 表结构
CREATE TABLE "NEW_BIZ"."T22" (
"NUM1" NUMBER(12) DEFAULT NULL NOT NULL ENABLE,
"NUM2" NUMBER(12) DEFAULT NULL,
CONSTRAINT "PK_num1
" PRIMARY KEY ("NUM1")
) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;
-- 当前只有一条数据,ROWID 为 *AAEPAQAAwAMAAAA=
obclient [NEW_BIZ]> select rowid,num1,num2 from t22;
+-------------------+------+------+
| ROWID | NUM1 | NUM2 |
+-------------------+------+------+
| *AAEPAQAAwAMAAAA= | 3 | 3 |
+-------------------+------+------+
1 row in set (0.104 sec)
-- 第一次更新,影响一条数据
obclient [NEW_BIZ]> update t22 set num1=4,num2=4 where rowid='*AAEPAQAAwAMAAAA=';
Query OK, 1 row affected (0.100 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- 第二次更新,影响 0 行
obclient [NEW_BIZ]> update t22 set num1=5,num2=5 where rowid='*AAEPAQAAwAMAAAA=';
Query OK, 0 rows affected (0.096 sec)
Rows matched: 0 Changed: 0 Warnings: 0
-- 检查当前 rowid,第一次更新了主键,导致 rowid 发生了改变,所以第二次不会更新数据
obclient [NEW_BIZ]> select rowid,num1,num2 from t22;
+-------------------+------+------+
| ROWID | NUM1 | NUM2 |
+-------------------+------+------+
| *AAEPAQAAwAQAAAA= | 4 | 4 |
+-------------------+------+------+
问题原因
在预期内,OceanBase 数据库的 rowid 在 V3.x 版本中都是包含主键的,无主键表 rowid 包含自增列。 当主键值发生改变,相同的 rowid 第二次就不会更新到数据。也就是说当主键值发生改变时,它的 rowid 也会改变。
问题的风险及影响
无影响。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V3.x 版本。
解决方法
不需要解决,如果有业务这样做,需要修改业务。