Mysql 如何将代码优化为在处理多个请求时造成大量延迟的同步块
我正在编写一些代码,其中我有一个库存表,其中有A、B、C项,数量为2,1,2 现在,多个用户可以调用我的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: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级锁定是否比代码级锁定更好
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锁定,因为我不知道有任何其他更好的方式(所有项目必须在场才能完成订单)。因此,我们首先需要确保物品存在,还需要确保没有其他交易会更新我们刚刚读取的相同库存记录,以确保一致性
如果有其他更好的方法,请告诉我