springboot + shardingSphere5.0 + Dubbo2.7.x实现分库分表的情况下,集成 + seata1.4.2后,报出以下异常: Could not found any index in the table: xxx

方便更快捷的说明问题,可以按需填写(可删除)
springboot + shardingSphere5.0 + seata1.4.2 + dubbo2.7.7 +mysql
使用sharding5进行分为分表,Order与Goods各分三个库,order与goods表分4个表,保存订单的时候报:Could not found any index in the table: t_order;
原因:无法获取到表的主键与索引信息

使用环境:

springboot + shardingSphere5.0 + seata1.4.2 + dubbo2.7.7 +mysql
使用sharding5进行分为分表,Order与Goods各分三个库,order与goods表分4个表,保存订单的时候报:Could not found any index in the table: t_order

场景、问题:

添加Seata的全局事务@GlobalTransactional注解时,执行保存订单的时候报:Could not found any index in the table: t_order,查看源代码:org.apache.shardingsphere.driver.jdbc.core.datasource.metadata.ShardingSphereDatabaseMetaData#getIndexInfo方法,无法获取到表的主键与索引。

请问是什么原因

您好, 请把您的配置发一下, 如果可以的话最好提供一个 demo.

不好意思,这个demo不方便提供,查了下源代码,详情如下:

提供下配置文件吧, 重要的信息您可以马赛克处理下.

配置信息如下:

spring:
  shardingsphere:
    props:
      sql-show: true
    datasource:
      names: ds0,ds1,ds2
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://IP:3306/hl_mall_order_cluster_0?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useInformationSchema=false&serverTimezone=UTC
        username: xxx
        password: xxxx
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://IP:3306/hl_mall_order_cluster_1?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useInformationSchema=false&serverTimezone=UTC
        username: xxx
        password: xxxx
      ds2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://IP:3306/hl_mall_order_cluster_2?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useInformationSchema=false&serverTimezone=UTC
        username: xxx
        password: xxxx
    rules:
      sharding:
        default-database-strategy:
          inline:
            sharding-column: order_id
            algorithm-expression: ds$->{order_id % 3}
        key-generators:
          snowflake:
            type: SNOWFLAKE
            props:
              worker-id: 1
        sharding-algorithms:
          order-inline:
            type: INLINE
            props:
              algorithm-expression: t_order$->{order_id % 4}
          order-item-inline:
            type: INLINE
            props:
              algorithm-expression: t_order_item$->{order_id % 4}
          database-inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{order_id % 3}
        tables:
          t_order_item:
            actual-data-nodes: ds$->{0..2}.t_order_item$->{0..3}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: order-item-inline
            database-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: database-inline
          t_order:
            actual-data-nodes: ds$->{0..2}.t_order$->{0..3}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: order-inline
            database-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: database-inline
    enabled: true

表结构方便提供下吗?

无法上传附件。库名称:
hl_mall_goods_cluster_0,hl_mall_goods_cluster_1,hl_mall_goods_cluster_2
hl_mall_order_cluster_0,hl_mall_order_cluster_1,hl_mall_order_cluster_2,

order DLL信息如下:

CREATE TABLE t_order0 (
order_id bigint(20) NOT NULL COMMENT ‘订单流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_no varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘订单编号’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_id) USING BTREE,
UNIQUE INDEX order_no_index(order_no) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单表’ ROW_FORMAT = Dynamic;


– Table structure for t_order1


DROP TABLE IF EXISTS t_order1;
CREATE TABLE t_order1 (
order_id bigint(20) NOT NULL COMMENT ‘订单流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_no varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘订单编号’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_id) USING BTREE,
UNIQUE INDEX order_no_index(order_no) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单表’ ROW_FORMAT = Dynamic;


– Table structure for t_order2


DROP TABLE IF EXISTS t_order2;
CREATE TABLE t_order2 (
order_id bigint(20) NOT NULL COMMENT ‘订单流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_no varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘订单编号’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_id) USING BTREE,
UNIQUE INDEX order_no_index(order_no) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单表’ ROW_FORMAT = Dynamic;


– Table structure for t_order3


DROP TABLE IF EXISTS t_order3;
CREATE TABLE t_order3 (
order_id bigint(20) NOT NULL COMMENT ‘订单流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_no varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘订单编号’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_id) USING BTREE,
UNIQUE INDEX order_no_index(order_no) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单表’ ROW_FORMAT = Dynamic;


– Table structure for t_order_item0


DROP TABLE IF EXISTS t_order_item0;
CREATE TABLE t_order_item0 (
order_item_id bigint(20) NOT NULL COMMENT ‘订单明细流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_id bigint(20) NULL DEFAULT NULL COMMENT ‘订单流水ID’,
seller_id bigint(20) NULL DEFAULT NULL COMMENT ‘商家流水ID’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_item_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单明细’ ROW_FORMAT = Dynamic;


– Table structure for t_order_item1


DROP TABLE IF EXISTS t_order_item1;
CREATE TABLE t_order_item1 (
order_item_id bigint(20) NOT NULL COMMENT ‘订单明细流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_id bigint(20) NULL DEFAULT NULL COMMENT ‘订单流水ID’,
seller_id bigint(20) NULL DEFAULT NULL COMMENT ‘商家流水ID’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_item_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单明细’ ROW_FORMAT = Dynamic;


– Table structure for t_order_item2


DROP TABLE IF EXISTS t_order_item2;
CREATE TABLE t_order_item2 (
order_item_id bigint(20) NOT NULL COMMENT ‘订单明细流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_id bigint(20) NULL DEFAULT NULL COMMENT ‘订单流水ID’,
seller_id bigint(20) NULL DEFAULT NULL COMMENT ‘商家流水ID’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_item_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单明细’ ROW_FORMAT = Dynamic;


– Table structure for t_order_item3


DROP TABLE IF EXISTS t_order_item3;
CREATE TABLE t_order_item3 (
order_item_id bigint(20) NOT NULL COMMENT ‘订单明细流水ID’,
user_id bigint(20) NULL DEFAULT NULL COMMENT ‘用户流水ID’,
order_id bigint(20) NULL DEFAULT NULL COMMENT ‘订单流水ID’,
seller_id bigint(20) NULL DEFAULT NULL COMMENT ‘商家流水ID’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (order_item_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘订单明细’ ROW_FORMAT = Dynamic;


– Table structure for undo_log


DROP TABLE IF EXISTS undo_log;
CREATE TABLE undo_log (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘increment id’,
branch_id bigint(20) NOT NULL COMMENT ‘branch transaction id’,
xid varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘global transaction id’,
context varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘undo_log context,such as serialization’,
rollback_info longblob NOT NULL COMMENT ‘rollback info’,
log_status int(11) NOT NULL COMMENT ‘0:normal status,1:defense status’,
log_created datetime NOT NULL COMMENT ‘create datetime’,
log_modified datetime NOT NULL COMMENT ‘modify datetime’,
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX ux_undo_log(xid, branch_id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘AT transaction mode undo table’ ROW_FORMAT = Dynamic;

Goods DLL信息如下:

DROP TABLE IF EXISTS t_product0;
CREATE TABLE t_product0 (
id bigint(20) NOT NULL COMMENT ‘商品ID’,
name varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘商品名称’,
num int(11) NOT NULL COMMENT ‘商品数量’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘商品表’ ROW_FORMAT = Dynamic;


– Table structure for t_product1


DROP TABLE IF EXISTS t_product1;
CREATE TABLE t_product1 (
id bigint(20) NOT NULL COMMENT ‘商品ID’,
name varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘商品名称’,
num int(11) NOT NULL COMMENT ‘商品数量’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘商品表’ ROW_FORMAT = Dynamic;


– Table structure for t_product2


DROP TABLE IF EXISTS t_product2;
CREATE TABLE t_product2 (
id bigint(20) NOT NULL COMMENT ‘商品ID’,
name varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘商品名称’,
num int(11) NOT NULL COMMENT ‘商品数量’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘商品表’ ROW_FORMAT = Dynamic;


– Table structure for t_product3


DROP TABLE IF EXISTS t_product3;
CREATE TABLE t_product3 (
id bigint(20) NOT NULL COMMENT ‘商品ID’,
name varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘商品名称’,
num int(11) NOT NULL COMMENT ‘商品数量’,
create_time date NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘商品表’ ROW_FORMAT = Dynamic;


– Table structure for undo_log


DROP TABLE IF EXISTS undo_log;
CREATE TABLE undo_log (
id bigint(20) NOT NULL AUTO_INCREMENT,
branch_id bigint(20) NOT NULL,
xid varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
context varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
rollback_info longblob NOT NULL,
log_status int(11) NOT NULL,
log_created datetime NOT NULL,
log_modified datetime NOT NULL,
ext varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX ux_undo_log(xid, branch_id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

t_order 和 t_order_item 的表结构, DDL

刚才还没有编辑完,已经补充了

好的, 收到了, 我看看.

您好, 我这边尝试了下, 自己写了个demo, 并没有出现您所描述的问题. shardingsphere-sharding-db-table-demo 2.zip (37.6 KB)

感谢你的回复,单独使用sharding是没有问题,集成seata1.4.2后就会有问题,在seata调用sharding的
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetMetaData#getTableName 方法获取的表名为逻辑表名(t_order),导致后续逻辑错误,Debug的过程中,我手动设置一个正确的物理表名,后续逻辑一切正常

好的, 我试试看, 如果您有兴趣修复这个问题, 也欢迎提交 pull request 哦.

有兴趣,就是不知道如何参与其中啊,求指教

我看你在 github 有提交过这个问题? springboot + shardingSphere5.0 + Dubbo2.7.x实现分库分表的情况下,集成 + seata1.4.2后,报出以下异常: Could not found any index in the table: xxx · Issue #14518 · apache/shardingsphere · GitHub 这个是你提交的吗? 可以在这个 issue 下面直接英文评论下, 认领这个任务.

京ICP备2021015875号