Reentrantlock锁+事务Transaction的漏洞,正常超卖场景实战!
解决方案
第一种 :手动提交事务。自己开启事务,自己在提交事务。
核心代码 在 解锁unlock之前提交事务。
第二种:既然是方法之后提交事务,
那么用A方法(负责上锁解锁) 调用B方法 (负责处理减库存操作)
// @see https://blog.csdn.net/weixin_42771651/article/details/120070820?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-120070820-blog-120074312.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-120070820-blog-120074312.pc_relevant_default&utm_relevant_index=1
ReentrantLock lock = new ReentrantLock();
@Override
public void payReward(String recommendAddress) throws Exception {
lock.lock();
try {
payRewardInfact(recommendAddress);
} finally {
lock.unlock();
}
}
@Transactional(readOnly = false, isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED)
public void payRewardInfact(String recommendAddress) throws Exception {
// ......
}