我正在开发仓库系统,该系统可以管理具有不同BBD的产品(日期前最好)。 因此表非常简单(我使用的是MySQL + PHP)
ID - PK, Autoincrement
ProductID - FK products
Quantity - positive, if put products to warehouse and negative if take from warehouse
BBD - best before date
OperationDate - DATETIME when operation was created
我有一些货物到达仓库,我只需向该表中添加行,例如
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, 500, '2022-02-02', UTC_TIMESTAMP());
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, 100, '2022-05-15', UTC_TIMESTAMP());
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, 50, '2022-10-27', UTC_TIMESTAMP());
但是问题是,当我想从仓库中取出一定数量的货物时。
例如,我有2个订单(从FROM仓库取货)
第一个是550
件,第二个是70
件。
计算的最佳方法和算法是什么?每个订单将使用什么Quantity
和BBD
?
在我的一阶示例中:
500 pieces with bbd: 2022-02-02
50 pieces with bbd: 2022-05-15
in sql:
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, -500, '2022-02-02', UTC_TIMESTAMP());
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, -50, '2022-05-15', UTC_TIMESTAMP());
第二阶:
50 pieces with bbd: 2022-05-15
20 pieces with bbd: 2022-10-27
in sql:
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, -50, '2022-05-15', UTC_TIMESTAMP());
INSERT INTO warehouse (ProductID, Quantity, BBD, OperationDate) VALUES (1, -20, '2022-10-27', UTC_TIMESTAMP());
主要-最糟糕的BBD将首先离开仓库。
我应该如何实现锁/事务/等。是否会有很多平行的进出订单?
我的第一个想法是,当我计算要减少的BBD时,是否能够以某种方式阻止确切的ProductID甚至进行READ操作。我尝试使用LOCK TABLES
,但它需要锁定查询中的每个表,而不是很好的解决方案。我尝试进行SELECT ... FOR UPDATE
,但不确定是否会阻止从其他会话读取相同的行。
那么,什么是正确的方法呢?
答案 0 :(得分:0)
InnoDB(我假设您正在使用)支持行锁定,并且您可以使用SELECT ... FOR UPDATE来做到这一点。
您可以通过运行2个不同的脚本轻松地进行测试,一个尝试更新,另一个尝试选择,选择查询将等待更新完成。
我不确定您为什么要在此处插入记录,我想您的意思是UPDATE。