gpt4 book ai didi

mysql - 我想向客户销售固定数量的产品。 spring jpa如何管理并发?

转载 作者:行者123 更新时间:2023-11-29 16:33:33 25 4
gpt4 key购买 nike

在 Spring Boot 中使用 spring data jpa。

我有一个用例 我想销售 n 种产品,但一次收到了 n+1 个产品的请求。那么我如何确保我应该只销售 n 个产品并且不会失败所有其他请求。

Suppose I have 10 quantity for any product id 1. And got 11 requests at the same time for that particular product. How I can ensure that system sell only 10 product and fail the last request because of out of stock.

All the request can execute at the same time.

我正在使用 MySql。

如果我使用@version,除了第一个事务外,所有其他事务都会失败。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Version;

@Entity
public class ProductStockTable {

@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;

private Long productId;

@Version
private Long version;

private Long currentStock;

public Long getId() {
return Id;
}

public void setId(Long id) {
Id = id;
}

public Long getProductId() {
return productId;
}

public void setProductId(Long productId) {
this.productId = productId;
}

public Long getVersion() {
return version;
}

public void setVersion(Long version) {
this.version = version;
}

public Long getCurrentStock() {
return currentStock;
}

public void setCurrentStock(Long currentStock) {
this.currentStock = currentStock;
}
}

@Transactional
public boolean checkStock(Long productId, Integer stock) {

ProductStockTable ps = stockRepo.findById(productId);
if (ps.getCurrentStock() > stock) {
ps.setCurrentStock(ps.getCurrentStock()-stock);
stockRepo.save(ps);
return true;
}
return false;

}

如果我为 currentStock 设置 MySql 约束非负,它也不起作用。

有什么可能的方法可以在 Spring boot 中实现这一点吗?

最佳答案

在流程完成之前调用您的 checkstock 函数?开始时一次,结束时一次,以及更新数据库和更改库存后直接进行。

另一种选择可能是当您发送请求时 - 在最终确定之前更新该库存(这样它在某人的购物车中时就被锁定)。在购物车上放置一个计时器,以便 5 分钟后自动重新进货(我更喜欢选项 1,更新数据库通常会放置一个临时锁,该锁将停止 select 语句,直到更新完成)

关于mysql - 我想向客户销售固定数量的产品。 spring jpa如何管理并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com