码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表


    目录

      • 一、问题描述
      • 二、问题解决
        • 1.场景一:同一事务中,新增并更新
          • 1.1 解决方案:
        • 2.场景二:不同事务中,新增后更新场景
          • 2.1 解决方案:

    一、问题描述

    我们在使用 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 = ?;
    
    • 1

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

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

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


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

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

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

    整理完毕,完结撒花~ 🌻

  • 相关阅读:
    【Redis入门笔记 04】事务的基本操作
    [附源码]计算机毕业设计基于JEE平台springboot技术的订餐系统
    Python制作炫酷的个人足迹地图
    【JavaEE】Spring更简单的存储和获取对象(类注解、方法注解、属性注入、Setter注入、构造方法注入)
    从零实现深度学习框架——Transformer从菜鸟到高手(一)
    极智开发 | 一文看透H100 Hopper架构的各种提升
    基于51单片机步进电机加减速正反转数码管显示( proteus仿真+程序+原理图+设计报告+讲解视频)
    算法-合并 K 个升序链表
    《MLB棒球创造营》:走近棒球运动·多伦多蓝鸟队
    vscode远程linux安装codelldb
  • 原文地址:https://blog.csdn.net/qq_33204709/article/details/133638357
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号