Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL数据一致性:多个用户同时购买同一产品_Mysql_Spring Mvc - Fatal编程技术网

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,正确的方法是使用单个事务,这将在过程中执行以下操作:

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

    • 正确的方法是使用单个事务,该事务将在流程中执行以下操作:

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

      将此逻辑放入数据库,最好在插入前触发。或者您创建一个过程来完成它。@JorgeCampos过程可以很好地完成这项工作。但我的数据库将在集群中,表将在不同的机器中,因此我无法使用procedure@JorgeCampos我想要一个无数据库的方法来解决这个问题。为什么不呢?对于过程/函数来说,集群不会成为问题(因为mysql不支持过程)。集群将由RDBMs本身管理,您的应用层不必关心它that@JorgeCampos好的,我试试看。但是有没有任何非数据库的方法来解决这个问题呢?把这个逻辑放到数据库中,最好在插入前触发。或者您创建一个过程来完成它。@JorgeCampos过程可以很好地完成这项工作。但我的数据库将在集群中,表将在不同的机器中,因此我无法使用procedure@JorgeCampos我想要一个无数据库的方法来解决这个问题。为什么不呢?对于过程/函数来说,集群不会成为问题(因为mysql不支持过程)。集群将由RDBMs本身管理,您的应用层不必关心它that@JorgeCampos好的,我试试看。但是有没有办法解决这个问题呢?