【技巧】并发读取Mysql数据保证读取到的数据不重复

【技巧】并发读取Mysql数据保证读取到的数据不重复

使用场景:

        并发场景下, 保证不获取到重复的数据

思路: 先通过 MYSQL锁 去占位打标识,然后再去取数据 

        相当于几个人抢蛋糕, A先把蛋糕打上记号 蛋糕是A的, 然后再慢慢吃

表结构

表 t_user

id
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 (
SELECT
	id 
FROM
	t_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判断 如果超时的 可以去释放锁  比如超时半个小时等

你可能感兴趣的:(并发线程,mysql,数据库)