Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表

这篇具有很好参考价值的文章主要介绍了Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题描述

我们在使用 ShardingJDBC 作为分片工具的时候,会在配置中指定分片键,例如根据 create_time 创建时间来按月分片是比较常用的操作。当分片表中需要根据主键 ID 来进行更新的时候,由于不确定数据的 create_time 具体是多少,ShardingJDBC 就会在选择使用分片表的时候,就会默认选择全部。如果涉及到事务就有可能会产生 锁表事务等待 等问题,从而导致数据库操作时间延长


二、问题解决

首先从逻辑上讲,在没有确定分片键值的情况下,确实没有办法只根据ID确定数据所在分表的位置

但是俗话说,没有绝对的问题,只有相对的场景。我们要从场景入手,才能找到解决问题的办法。

所以,我们要先确认根据ID更新的使用场景:

1.场景一:同一事务中,新增并更新

例如:将数据插入到数据库中后,还需要使用数据库中生成的ID,来更新同一条数据的其他字段的话,就会涉及到根据主键更新扫描全部分表的问题。

1.1 解决方案:

由于是先新增后更新,那么我们程序中已经拿到了 set 好的 createTime 字段,所以我们在更新的时候,只需要在 where 中再添加一下 create_time 的筛选条件就好了:

update t_user set user_no = id where id = ? and create_time = ?;

如果是数组的话,可以这样:

update t_user set user_no = id where id in (?, ?) and create_time in (?, ?);

这样就可以大大缩小操作分表的范围。


2.场景二:不同事务中,新增后更新场景

例如:在列表中编辑某一条数据的时候,就会涉及到根据主键更新扫描全部分表的问题。

2.1 解决方案:
  • 实现1: 在列表查询的时候就查询出创建时间,然后编辑的时候将创建时间和主键一起通过入参传回来。
  • 实现2: 在更新之前,先根据主键查询出数据的创建时间查询出来,由于查询不会进行锁表,也不需要事务等待,所以先查询,然后再根据查询出的创建时间和主键一起作为条件进行更新操作。

整理完毕,完结撒花~ 🌻文章来源地址https://www.toymoban.com/news/detail-728218.html

到了这里,关于Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot~sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(45)
  • sharding-jdbc多数据源配置

    通过sharding-jdbc做分表这里就不多做介绍了,需要的可以看上一片文章 当项目中配置了多数据源,并且其中一个数据源需要使用sharding-jdbc分表时,配置如下 导入shardingjdbc依赖 这里使用的是4.0.1的配置,和上篇的3.1.0差别不大,详细配置大伙可以上官网查阅。 多数据源配置类

    2024年02月14日
    浏览(49)
  • Sharding-JDBC之PreciseShardingAlgorithm(精确分片算法)

      在我之前的文章里,数据的分库分表都是基于行表达式的方式来实现的,看起来也蛮好用,也挺简单的,但是有时会有些复杂的规则,可能使用行表达式策略会很复杂或者实现不了,我们就讲另外一种分片策略,精确分片算法,通常用来处理=或者in条件的情况比较多。

    2024年02月11日
    浏览(45)
  • springboot~对应sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(34)
  • Sharding-JDBC分库分表四种分片算法

    精确分片算法(PreciseShardingAlgorithm)精确分片算法(=与IN语句),用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用 范围分片算法(RangeShardingAlgorithm)用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景。需要配合StandardShardingS

    2024年02月10日
    浏览(38)
  • springboot整合sharding-jdbc实现分库分表详解

    目录 一、为什么需要分库分表 1.1 分库分表的优势 二、分库分表基本概念 2.1 垂直分表

    2024年02月05日
    浏览(54)
  • Sharding-JDBC分库分表-自动配置与分片规则加载原理-3

    Sharding JDBC自动配置的原理 与所有starter一样,shardingsphere-jdbc-core-spring-boot-starter也是通过SPI自动配置的原理实现分库分表配置加载,spring.factories文件中的自动配置类shardingsphere-jdbc-core-spring-boot-starter功不可没,他主要是自动创建了模式bean、事务类型bean和数据源bean,配置加载

    2024年02月10日
    浏览(43)
  • SpringBoot+Sharding-jdbc+mybatis-plus实现水平分表

    这块我就不演示了

    2024年02月12日
    浏览(31)
  • 一、Sharding-JDBC系列01:整合SpringBoot实现分库分表,读写分离

    目录 一、概述 二、案例演示-水平分表 (1)、创建springboot工程 (2)、创建数据库和数据表 (3)、application.yaml配置分片规则   (4)、测试数据插入、查询操作 4.1、插入-控制台SQL日志  4.2、查询-控制台SQL日志  三、案例演示-水平分库 (1)、创建数据库和数据表  (2)、application.yaml配置

    2024年02月02日
    浏览(45)
  • Sharding-JDBC(六)5.1.0版本,实现按月分表、自动建表、自动刷新节点

    官网地址: https://shardingsphere.apache.org/ GitHub: https://github.com/apache/shardingsphere 官方示例: https://github.com/apache/shardingsphere/tree/master/examples 中文社区: https://community.sphere-ex.com/ 5.1.0 官方文档: https://shardingsphere.apache.org/document/5.1.0/cn/overview/ 背景: 项目用户数据库表量太大,对

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包