如何批量修改某表某字段的值?

小白一枚,嘻嘻

多人预约,并记录每个人的预约状态,
预约状态有审核中,已通过,未通过。
A端假如100人同时发起预约,B端管理员审核预约,可能通过的也就两三个人,
B端管理员点击三次按钮就可以更新数据库预约状态,
其它97人不想依次点击了,设计在预约截止时间自动改变状态为未通过。
那么如何改变未通过人的状态?是循环update数据库?
如果不是,那么有什么更优的解决方案?

另外发起预约时如何保证不拥堵,应该选用哪些技术

阅读 2.2k
3 个回答

为实现批量修改预约状态且避免拥堵,你可以使用一次性的SQL更新语句,使用SQL语句一次性更新多行数据,而不是使用循环。这样可以减少数据库操作的次数。并结合缓存、限流、异步处理以及数据库优化技术以提高系统性能。

设计预约时间自动执行这个任务的话使用定时任务就可以,我想这不是你想要关注的重点
不同语言应该都有这样的框架或者自带的方法,比如Java里的Timer、Quartz框架、Spring Task等,一般搭配cron表达式使用就可以实现定时的效果
这里就不再赘述了
想要改变这些未通过人的状态,理论上它们在数据库里都有用户ID这个字段,如果你想指定这些ID,那你可以把它们都放进一个list里,然后用mybatis(我假设你使用mybatis)的批量更新:

List<Integer> userIdList = new ArrayList<>();
userIdList.add(第一个userId);
userIdList.add(第二个userId);
...
<update id="updateStatusBatch" parameterType="java.util.List">      
        update 审核表
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="审核状态的字段 = case" suffix="end,">
                <foreach collection="list" index="index" item="item">
                    when 用户ID = #{item.用户ID,jdbcType=INTEGER} then #{item.代表用户状态为未审核通过的值,jdbcType=VARCHAR}
                </foreach>
            </trim>      
        </trim>
        where 用户ID in
        <foreach close=")" collection="list" item="item" open="(" separator=", ">
            #{item.用户ID,jdbcType=INTEGER}                      #假设用户ID数据类型是int
        </foreach>
</update>

如果你不想指定是哪些ID要更新状态,只要用这样的SQL即可:

<update id="updateUserStatus">      
    update 审核表
    set 审核字段="代表用户状态为未审核通过的值"
    where 审核字段="代表用户状态为审核中的值"
</update>

至于发起预约时保证不拥堵得看你的数据量有多大了,具体的方案也不同,可以看一下大佬们的各种架构文章

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题