我正在开发一个网站,使用户可以在线购买产品。我得到了以下代码:
@Transactional(readOnly = false)
public void buy(Integer itemId) {
int amount = queryItemAmount(itemId); #1 // issue SELECT query
if (amount > 0) { #2
buy(itemId); // #3 issue UPDATE query, decrease the amount of this product
}
}
如果产品数量达到零,我担心会调用buy()
方法。
例如,2位用户同时购买同一产品。用户A刚刚完成执行#1并且该产品的数量为1,因此他将继续执行#2。但是在他执行#3之前,用户B刚刚完成执行#1并且也获得了该产品的数量1(因为用户A没有执行#3因此产品数量没有减少)。如果发生这种情况,用户B将购买不存在的产品零。
如何解决这个问题? 我正在使用SpringMVC-4.1.5和MySQL-5.5
答案 0 :(得分:0)
恕我直言,正确的方法是使用单一交易,这将在此过程中执行以下操作: