按照主键update,影响条数是两条,hibernate5使用saveOrUpdate异常

安装4.0.0版本后使用hibernate5进行连接,saveOrUpdate接口返回异常,发现影响条数为2条,使用Navicat工具update也是返回两条,有大佬知道怎么回事嘛?异常信息如下:
Caused by: org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1

表结构:CREATE TABLE SYS_PARAMETER (
TheKey varchar(100) CHARACTER SET gbk NOT NULL COMMENT ‘配置名称’,
TheValue varchar(1000) CHARACTER SET gbk DEFAULT NULL COMMENT ‘配置值’,
TheState int(11) DEFAULT ‘1’ COMMENT ‘默认1’,
ID int(11) NOT NULL AUTO_INCREMENT COMMENT ‘序号,自增长’,
PRIMARY KEY (ID),
UNIQUE KEY ID (ID) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 1003671 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;

UPDATE SYS_PARAMETER SET TheValue=0 WHERE ID=‘1003657’

Affected rows: 2
Time: 0.081s

1 个赞

表结构,sql都提供一下。不然怎么分析呢?

1 个赞

MySQL的行为如何,有没有跑过一些对比的测试?你把schema sql语法发一下

刚补充了下表结构和执行返回结果

刚补充了下表结构和执行返回结果,辛苦

刚编辑补充了

mysql执行时,如果修改字段有变化时返回1,没有变化时返回0;
ob则是有变化时返回2,没有变化时返回1

obclient [oceanbase]> CREATE TABLE SYS_PARAMETER (
    -> TheKey varchar(100) CHARACTER SET gbk NOT NULL,
    -> TheValue varchar(1000) CHARACTER SET gbk DEFAULT NULL COMMENT '配置值',
    -> TheState int(11) DEFAULT '1' COMMENT '默认1',
    -> ID int(11) NOT NULL AUTO_INCREMENT COMMENT '序号,自增长',
    -> PRIMARY KEY (ID),
    -> UNIQUE KEY ID (ID) BLOCK_SIZE 16384 LOCAL
    -> ) AUTO_INCREMENT = 1003671 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;
Query OK, 0 rows affected (0.043 sec)

obclient [oceanbase]> insert into SYS_PARAMETER values ('123', '123', 1, 1);
Query OK, 1 row affected (0.012 sec)

obclient [oceanbase]>  update SYS_PARAMETER  set TheValue=0 where ID = 1;
Query OK, 1 row affected (0.003 sec)
 Rows matched: 1  Changed: 1  Warnings: 0

OceanBase 4.0版本执行有变化的时候返回的结果是1

你可以把完整执行过程发一下,包括建表、数据插入、执行,看上去我这边执行的结果和你的描述并不一致

感觉可能跟mvcc版本数据有关
但是具体得测试
用obclient也是这样吗?

谢谢,找到原因了,是因为触发器的原因,在有触发器时,影响条数会不对

1 个赞

最后怎么解决的,不用触发器了?

CREATE TABLE a_user (
ID_ int(11) NOT NULL AUTO_INCREMENT,
ORG_ID_ int(11) DEFAULT NULL,
REALNAME_ varchar(20) DEFAULT NULL,
PASSWORD_ varchar(32) DEFAULT NULL,
STATUS_ char(1) DEFAULT NULL,
PRIMARY KEY (ID_)
);

CREATE TABLE b_user (
ID_ varchar(64) NOT NULL,
REV_ int(11) DEFAULT NULL,
FIRST_ varchar(255) DEFAULT NULL,
LAST_ varchar(255) DEFAULT NULL,
EMAIL_ varchar(255) DEFAULT NULL,
PWD_ varchar(255) DEFAULT NULL,
PICTURE_ID_ varchar(64) DEFAULT NULL,
PRIMARY KEY (ID_)
);

DELIMITER $$
$$
CREATE DEFINER = root@% TRIGGER TG_INSERT_A_USER AFTER INSERT ON a_user
FOR EACH ROW
BEGIN
INSERT INTO b_user (id_, rev_, first_, pwd_) SELECT new.id_, 1, new.realname_, new.password_;
END;$$
DELIMITER;

insert into a_user(org_id_,realname_,password_) values(1,‘test’,‘123’);