安装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 个赞
谷渐
#4
MySQL的行为如何,有没有跑过一些对比的测试?你把schema sql语法发一下
mysql执行时,如果修改字段有变化时返回1,没有变化时返回0;
ob则是有变化时返回2,没有变化时返回1
谷渐
#9
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
谷渐
#10
你可以把完整执行过程发一下,包括建表、数据插入、执行,看上去我这边执行的结果和你的描述并不一致
鱼干
#11
感觉可能跟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’);