Mysql 如何将代码优化为在处理多个请求时造成大量延迟的同步块

Mysql 如何将代码优化为在处理多个请求时造成大量延迟的同步块,mysql,database,locking,consistency,Mysql,Database,Locking,Consistency,我正在编写一些代码,其中我有一个库存表,其中有A、B、C项,数量为2,1,2 现在,多个用户可以调用我的订单功能,该功能将检查库存状态,如果订单中的所有项目都可用,则订单将完成 例如,我们有订单(A:2,B:1)。此订单可以在库存中存在项目时完成。但是如果我们有顺序(A:2,B:2),那么就不可能满足顺序,我们可以抛出一个异常 现在,在单请求系统中,上述内容很容易实现。但实际上,我们会有许多并发订单请求,比如用户1调用order(A:2,B:1)和用户2调用order(B:1,C:2),那么只有

我正在编写一些代码,其中我有一个库存表,其中有A、B、C项,数量为2,1,2

现在,多个用户可以调用我的
订单
功能,该功能将检查库存状态,如果订单中的所有项目都可用,则订单将完成

例如,我们有
订单(A:2,B:1)
。此订单可以在库存中存在项目时完成。但是如果我们有顺序(A:2,B:2),那么就不可能满足顺序,我们可以抛出一个异常

现在,在单请求系统中,上述内容很容易实现。但实际上,我们会有许多并发订单请求,比如用户1调用
order(A:2,B:1)
和用户2调用
order(B:1,C:2)
,那么只有一个订单可以满足,因为B项是订单的一部分,可用数量(1)小于组合订单数量(2)

首先,我想到了以下代码:

    Class Order{
      Map<String, Integer> requestedProducts;
    }

    // synchronize the order object as we need to have a consistent view of the available inventory
Class test {
    public void order(Order o){    
       synchronized(Order.class) {
         // do the database operations
       }
    }
   }
类顺序{
地图要求的产品;
}
//同步订单对象,因为我们需要有可用库存的一致视图
课堂测试{
公共无效令(o令){
已同步(Order.class){
//执行数据库操作
}
}
}
上述方法的明显缺点是对订单对象的锁定不是最优的

是否有其他最佳方式实现同样的目标,即完整订单可以完成,或者如果至少有一个项目缺失,订单失败?

在阅读了一些关于谷歌的文章后,我可以想到以下两种方式:

  • 使用具有适当隔离级别(如Read)的事务 已提交,确保在结束时检查当前事务 是否有任何其他事务没有提交与我们相同的数据 正在修改

  • 我可以使用MYSQL行级锁一起进行更新锁定 条款另外,请让我知道,与代码级锁定相比,db级锁定是否比代码级锁定更好


我只是在寻找许多不同的资源来解决上述问题,我认为最好的解决方案是启动一个事务,并根据订单中请求的产品数量使用行级锁

因此,不需要有一个同步锁,它是JVM级别的锁,如果我们的网站有多个实例在运行,那么同步锁机制就会失败。 因此,使用事务和行级锁,代码(伪代码)可能如下所示:

 while(restart the transaction if some error occurs such as timeout)
    begin transaction;
    String query = "select * from inventory where";
    for each(product in requested products){

      String productId = product.getProductId();
      query += "productid = "+productId;

      if(!lastProduct) {
        query += "OR"
      }
    }
    query += "FOR UPDATE";

   // will lead to lock on the rows  due to FOR UPDATE
    Resultset rs = execute(query);

    forEach(reuslt in resultSet){

     if(requested quantity available)
        update inventory with updated quantity for the product type in current result of resultSet
    }
}
在这种情况下,需要IMHO锁定,因为我不知道有任何其他更好的方式(所有项目必须在场才能完成订单)。因此,我们首先需要确保物品存在,还需要确保没有其他交易会更新我们刚刚读取的相同库存记录,以确保一致性

如果有其他更好的方法,请告诉我