MySQL数据一致性:多个用户同时购买同一产品
我正在开发一个网站,允许用户在线购买产品。我得到了以下代码:MySQL数据一致性:多个用户同时购买同一产品,mysql,spring-mvc,Mysql,Spring Mvc,我正在开发一个网站,允许用户在线购买产品。我得到了以下代码: @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
@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()
方法
例如,两个用户同时购买同一产品。用户A刚刚执行完#1,并且该产品的数量得到了1,因此他将继续执行#2。但是在他执行#3之前,用户B刚刚完成了#1的执行,并且这个产品的数量也得到了1(因为用户A没有执行#3,所以产品的数量没有减少)。如果发生这种情况,用户B将购买不应该存在的产品zero
如何解决这个问题?
我使用的是SpringMVC-4.1.5和MySQL-5.5,正确的方法是使用单个事务,这将在过程中执行以下操作:
- 锁定数据库中相应的行,以便其他事务无法修改它
- 检查产品是否足够(如果不够,警告用户并回滚)
- 让用户签出产品
- 提交并释放锁
- 锁定数据库中相应的行,以便其他事务无法修改它
- 检查产品是否足够(如果不够,警告用户并回滚)
- 让用户签出产品
- 提交并释放锁
- 正确的方法是使用单个事务,该事务将在流程中执行以下操作: