Java利用锁做秒杀_从构建分布式秒杀系统聊聊Lock锁使用中的坑

20be1f6e87874dff5ca490c564ad4e9d.png

前言

在单体架构的秒杀活动中,为了减轻DB层的压力,这里我们采用了Lock锁来实现秒杀用户排队抢购。然而很不幸的是尽管使用了锁,但是测试过程中仍然会超卖,执行了N多次发现依然有问题。输出一下代码吧,可能大家看的比较真切:

@Service("seckillService")

public class SeckillServiceImpl implements ISeckillService {

/**

* 思考:为什么不用synchronized

* service 默认是单例的,并发下lock只有一个实例

*/

private Lock lock = new ReentrantLock(true);//互斥锁 参数默认false,不公平锁

@Autowired

private DynamicQuery dynamicQuery;

@Override

@Transactional

public Result startSeckilLock(long seckillId, long userId) {

try {

lock.lock();

//这里、不清楚为啥、总是会被超卖101、难道锁不起作用、lock是同一个对象

String nativeSql = "SELECT number FROM seckill WHERE seckill_id=?";

Object object = dynamicQuery.nativeQueryObject(nativeSql, new Object[]{seckillId});

Long number = ((Number) object).longValue();

if(number>0){

nativeSql = "UPDATE seckill SET number=number-1 WHERE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值