目录

我的学习分享

记录精彩的程序人生

X

Reentrantlock锁+事务Transaction的漏洞,正常超卖场景实战!

https://blog.csdn.net/weixin_42771651/article/details/120070820?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166503915016781432947247%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166503915016781432947247&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-120070820-null-null.nonecase&utm_term=%E6%AD%A3%E5%B8%B8%E8%B6%85%E5%8D%96%E5%9C%BA%E6%99%AF%E5%AE%9E%E6%88%98&spm=1018.2226.3001.4450

解决方案

第一种 :手动提交事务。自己开启事务,自己在提交事务。

核心代码 在 解锁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 {
	// ......
}