【技巧】并发读取Mysql数据保证读取到的数据不重复
使用场景:
并发场景下, 保证不获取到重复的数据
思路: 先通过 MYSQL锁 去占位打标识,然后再去取数据
相当于几个人抢蛋糕, A先把蛋糕打上记号 蛋糕是A的, 然后再慢慢吃
表结构
表 t_userid
name
val
used_flag 是否使用过
lock_token 锁标识默认0
lock_token_time 加锁时间 方便超时之后释放锁
1 加锁
-- 生成随机加锁token = 123456
UPDATE t_user u
SET u.lock_token = 123456, u.lock_token_time = NOW()WHERE u.id IN (
SELECT id FROM (
SELECTid
FROMt_user
WHERE
-- 未被使用过used_flag = 0
-- 未被加锁AND lock_token = 0
-- 这里限制每次取多少条数据, 取决于业务LIMIT 10
-- 上锁FOR UPDATE) a
)
2 获取
SELECT * FROM t_user u
WHERE -- 未被使用过used_flag = 0
-- 指定的token锁AND lock_token = 123456
补充, 可以通过lock_token_time判断 如果超时的 可以去释放锁 比如超时半个小时等