工作中源代码学习数据库知识学习

集群并发-更新库存,验证用分布式锁的必要性

2023-07-17  本文已影响0人  ___TheOne___

1. 背景

点餐项目开发"优惠券需求",用户领取优惠券时、额外增加优惠券库存时,都更新库存值。另外项目是 集群部署
那么集群并发-更新库存,是否有使用分布式锁的必要性?

2. 猜想

答:有必要加Redission分布式锁。

    // 语句中 【stock - i >= 0】,防止优惠券超发
    @Transactional(rollbackFor = Exception.class)
    @Modifying(clearAutomatically = true)
    @Query(value = "update t_coupon set stock = stock - ?1 where id = ?2 and stock - ?1 >=0", nativeQuery = true)
    int deductionCount( int i,Long id);

Pgsql数据库,通过语句SHOW transaction_isolation; 可知事务默认隔离级别为 read committed【读提交】
虽然上述扣减库存的update语句,显式加了事务注解@Transactional,
但还是会出现集群并发扣减时,更新被覆盖-数据不一致的问题。

【执行场景设想】
两个事务同时针对同一个优惠券库存量执行扣减操作,它们都希望将库存值减1。

3. 验证

【最终结果】
Jmeter压力测试后,此优惠券的库存量为191,并非预想中的0
直接验证了集群并发-事务中更新库存,添加分布式锁的必要性!

4. 思考

上一篇 下一篇

猜你喜欢

热点阅读