从 并发导致重复会员号 的感悟

需求:
最近工作上有一个需求,生成一批不重复的会员号,在登录,注册是检测用户是否已有会员号,没有的话新增一个。在一开始使用的时候,并没有任何异常,一般的CURD能够处理。

在一次营销活动中,发现大批量user_id拥有相同的会员号。

解决方法:事务 + for update 乐观锁

START TRANSACTION;
SELECT id FROM v_ext WHERE user_id IS NULL LIMIT 1 FOR UPDATE; 
UPDATE v_ext SET user_id=xxx WHERE id=54;
COMMIT;
  • 读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新,一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁。

你可能感兴趣的:(从 并发导致重复会员号 的感悟)