多线程下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
相关产品推荐
相关产品推荐

