You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程下JDBC与HTTP DELETE请求执行冲突问题求助

解决多线程下JDBC重复取ID导致DELETE失败的思路
  • 数据库层面加锁标记
    查ID前先把目标记录标记为“待处理”,避免其他线程重复抓取。比如用带返回值的UPDATE语句锁定前100条:

    UPDATE your_table SET status = 'processing' WHERE id IN (SELECT id FROM your_table WHERE status = 'active' LIMIT 100) RETURNING id;
    

    每个线程拿到的都是自己锁定的ID,不会和其他线程撞车。DELETE完成后,再把状态更新为已删除或者直接删掉记录。

  • 线程安全队列共享ID分组
    不用每个线程单独查库,先开一个单线程把所有要删的ID按100个一组拆分,存入java.util.concurrent.ConcurrentLinkedQueue这种线程安全队列里。其他线程直接从队列里取ID串执行DELETE。这样既保证ID不重复,又能多线程并发跑DELETE,不会被限制单线程。

  • 按线程编号分配ID区间
    如果ID是连续自增的,可以根据线程号划分ID范围。比如有N个线程,线程1取ID模N等于0的记录,线程2取模N等于1的,以此类推:

    SELECT id FROM your_table WHERE id % ${__threadNum} = ${__threadNum}-1 LIMIT 100;
    

    每个线程只拿自己区间的ID,自然不会重复。注意要确保ID分布均匀,别让某个线程拿太多或者太少。

  • 分布式锁控制ID查询
    查ID前先抢一个分布式锁(比如Redis锁),同一时间只允许一个线程查ID。拿到锁的线程取走100条ID后释放锁,其他线程再继续。适合分布式压测场景,但会有一点性能损耗。

内容的提问来源于stack exchange,提问作者Singularity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:34:52