单节点分区表删除操作报data and columnID count not match

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】
影响删除基本操作,无法进行业务。

【可能的问题复现步骤】
创建分区表,主键ID自增,以及Hash分区字段。
执行语句:
set autocommit=0;
delete from xxx where id=xxx;

【看到的非预期行为】
执行上面语句后直接报错:
EncodeRow error: data and columnID count not match xx vs xx;
【期望看到的行为】
正常执行,并继续执行后面的commit操作;

【相关组件及具体版本】
tidb 5.1.0 版本
【其他背景信息或者截图】
k8s环境部署,但是是单节点部署,挂载磁盘,使用场景是开发测试环境。使用Mybatis plus进行数据库操作。

表为分区表,建立hash字段的6个分区。
直接客户端执行delete操作是没问题的。

REATE TABLE `member_application` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`org_id` INT(11) NOT NULL COMMENT '组织id',
	`group_name` VARCHAR(100) NULL DEFAULT NULL COMMENT '组名' COLLATE 'utf8mb4_bin',
	`member_examine_id` INT(11) NULL DEFAULT NULL COMMENT '成员审核单id',
	`member_id` INT(11) NULL DEFAULT NULL COMMENT '成员id',
	`member_tag` TINYINT(1) NULL DEFAULT NULL COMMENT '居民标签,如外籍、已故',
	`house_code` VARCHAR(10) NULL DEFAULT NULL COMMENT '户编码' COLLATE 'utf8mb4_bin',
	`name` VARCHAR(100) NULL DEFAULT NULL COMMENT '姓名' COLLATE 'utf8mb4_bin',
	`sex` TINYINT(1) NULL DEFAULT NULL COMMENT '性别:1:男;0:女',
	`nation` INT(2) NULL DEFAULT NULL COMMENT '民族',
	`document_type` INT(1) NULL DEFAULT NULL COMMENT '证件类型',
	`id_number` VARCHAR(20) NULL DEFAULT NULL COMMENT '证件号码' COLLATE 'utf8mb4_bin',
	`is_householder` INT(1) NULL DEFAULT NULL COMMENT '是否户主:1:是;0:否',
	`relation` INT(1) NULL DEFAULT NULL COMMENT '与户主关系',
	`confirmation_time` DATETIME NULL DEFAULT NULL COMMENT '确认时间',
	`is_holding_share` INT(1) NULL DEFAULT NULL COMMENT '是否持有股份',
	`land_area` DECIMAL(8,2) NULL DEFAULT NULL COMMENT '所在户承包地面积',
	`homestead_area` DECIMAL(8,2) NULL DEFAULT NULL COMMENT '所在户宅基地面积',
	`address` VARCHAR(100) NULL DEFAULT NULL COMMENT '户籍地址' COLLATE 'utf8mb4_bin',
	`phone` VARCHAR(20) NULL DEFAULT NULL COMMENT '联系电话' COLLATE 'utf8mb4_bin',
	`reason` VARCHAR(100) NULL DEFAULT NULL COMMENT '原因' COLLATE 'utf8mb4_bin',
	`remark` VARCHAR(100) NULL DEFAULT NULL COMMENT '备注' COLLATE 'utf8mb4_bin',
	`application_type` INT(1) NULL DEFAULT NULL COMMENT '申请类型',
	`create_user_id` VARCHAR(32) NULL DEFAULT NULL COMMENT '创建人' COLLATE 'utf8mb4_bin',
	`create_user_name` VARCHAR(20) NULL DEFAULT NULL COMMENT '创建人名字' COLLATE 'utf8mb4_bin',
	`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	`del_flag` INT(1) NOT NULL DEFAULT '0' COMMENT '删除状态,0 未删除, 1 已删除',
	`is_member` INT(1) NULL DEFAULT NULL COMMENT '是否成员,0 是,1 否',
	`business_type` INT(1) NULL DEFAULT NULL COMMENT '业务类型:0:成员导入',
	PRIMARY KEY (`id`, `org_id`) USING BTREE,
	UNIQUE INDEX `uk_orgId_examineId_idNumType_idNumber` (`org_id`, `member_examine_id`, `document_type`, `id_number`) USING BTREE
)
COMMENT='成员表申请表(成员导入,成员维护公用)'
COLLATE='utf8mb4_bin'
ENGINE=InnoDB
PARTITION BY HASH(`org_id`)
PARTITIONS 6;
;

删除语句

delete from member_application where id = xxx;
1 个赞

使用原生的 mybatis 操作有同样问题吗

这个我确认下。
我们自己在mysql客户端上执行同样的删除语句是可以执行的。
通过抓包,发现mybatis-plus在执行前多执行了 set autocommit=0这个语句。
在自己客户端加上这句一起提交请求时,就能复现这个错误了。

tidb 4.0.14 版本下也有类似异常

麻烦问下,有什么解决办法吗?我也遇到这种问题

tidb.log 日志有没有打印报错信息和 SQL

这个问题怎么解决啊,我加事务就会这样

单节点本来就测试用的,后来建表没加分区了,就没管这个事情了,线上多节点正常部署的没有这个问题。

Soga,我再研究研究。