业务问题:用户抢券,高并发。
业务表: 券表(简称:A),主要字段 id,券号,批次号,所属用户 ID
发券方法: 将当前批次 X 中的 未分配的券 发给当前用户 user1
原方法伪代码:
fun(batchId,userId){
[第一步] 当前的券 = select id from A WHERE A.批次号=batchId and 状态=未分配
[第二步] update A set A.所属用户 ID = userId where A.id = 当前的券
}
存在问题: 不安全,明明刚更新给了张三的,结果转眼下个线程又给更新成李四了。
我的想法: 采用乐观锁来更新。但是如果乐观锁更新失败了如何“重试”? 我 AtomicInteger 中的“重试”采用但是 do...while... 循环。
问: 实际场景中 do...while... 不太合适吧? 这里你们是怎么重试的,重试多少次? 或者这个问题,又没有更好的解决方案。