MyCat_分片&ER分片及其查询插入更新异常等问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

分片&ER分片

分片&ER分片说明

  • 分片会根据分片规则定位到不同的node中
  • ER分片的子表的parentId如果就是父表的分片字段,会直接根据此字段进行分片
  • ER分片的子表的parentId如果不是父表的分片字段,会查找父表所在的分片来确定字表的分片

order字段有限制

所有order的字段必须都在select字段中 select id form table1 order by name,查询报异常

分片数据更新异常

分片的表,update时不允许更新分片字段即便更新的内容与原内容一致也不允许

ER分片插入异常

当父表和子表数据在一个事务中提交时,如果字表的parentId不是父表的分片字段,
例如基本配置中的parentId为父表的ID字段,但是父表的分片字段为user_code不是ID。同时提交报错如下:
[Err] 1064 - can't find (root) parent sharding node for sql:。 ER分片需要查询父表所在的分片,如果是ER关系的表是在一个事务中插入数据是不可以的,只能分开提交。 或者使用冗余字段放弃使用ER分片。

配置如下:


    
        
            user_code
            test-rule-func
        
    

        
        

测试代码:

    public static void testAdd(DataSourceFactory ds) throws SQLException {
        int index = 4;
        Connection connection = ds.getConnection();
        connection.setAutoCommit(false);
        PreparedStatement ps1 = connection.prepareStatement("insert z_user (id,user_code,name) values (?,?,?) ");
        ps1.setString(1, "" + index);
        ps1.setString(2, "user" + index);
        ps1.setString(3, "用户" + index);
        ps1.executeUpdate();
        // 此处不提交,两个数据一起提交 
        PreparedStatement ps2 = connection.prepareStatement("insert z_order (id,p_id,name) values (?,?,?) ");
        ps2.setString(1, "" + index);
        ps2.setString(2, "" + index);
        ps2.setString(3, "订单" + index);
        ps2.executeUpdate();
        connection.commit();
        connection.close();
    }

转载于:https://my.oschina.net/sandant/blog/698890

你可能感兴趣的:(MyCat_分片&ER分片及其查询插入更新异常等问题)