MySQL数据一致性:多个用户同时购买同一产品

时间:2015-09-21 13:49:31

标签: 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 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

1 个答案:

答案 0 :(得分:0)

恕我直言,正确的方法是使用单一交易,这将在此过程中执行以下操作:

  • 锁定数据库中的相应行,以便其他事务无法修改它,
  • 检查产品是否足够(如果没有,警告用户并回滚)
  • 让用户签出产品
  • 提交并解除锁定