有个疑问分布式锁解决某用户重复抢单的问题?

来源:4-7 Redisson分布式锁的应用

smniuhe

2020-12-20

感觉像是老师故意设计的,有个很明显的线程安全问题是,当同一个用户由于并发量比较高的情况下,部分用户通过【是否重复购票】验证,直接进入抢锁入口,是否需要在锁住的资源层面,进行再次【是否重复购票】验证

try {
            // Redisson 分布式锁处理
            boolean isLocked = lock.tryLock(expireTime, TimeUnit.MILLISECONDS);
            if (isLocked) {
                AssertUtil.isTrue(voucherOrdersMapper.findDinerOrder(dinerInfo.getId(),
                        seckillVouchers.getFkVoucherId()) != null, "该用户已抢到该代金券,无需再抢");

                // 下单
                VoucherOrders voucherOrders = new VoucherOrders();
                voucherOrders.setFkDinerId(dinerInfo.getId());
                ...
                
	}
写回答

2回答

慕仔8930017

2021-01-13

请教一下。按照课程中老师的设计,锁的过期时间 = 活动结束时间 - 当前时间。 所以参加过活动的用户在活动期间是拿不到锁的,为啥还需要在锁住的资源层面,进行再次【是否重复购票】验证呢?

0
0

InCowboy

2020-12-22

这都被你发现了,这里在判断一下也是可以的

0
1
慕神3806958
我倒觉得不用多次判断是否重复购票,只需要将加锁的逻辑放在秒杀service方法的一开头部分,保证一个用户对同一种优惠券只能先去获取锁,获取不到,直接就返回了
2021-05-16
共1条回复

高级Redis进阶课 解决Redis实际问题+掌握Redis6.x特性

以项目整合Redis各种场景,从此轻松应对各类Redis难题

934 学习 · 353 问题

查看课程