PHP + MySQL上的仓库管理系统

时间:2019-12-11 12:23:54

标签: mysql transactions locking

我正在开发仓库系统,该系统可以管理具有不同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件。

计算的最佳方法和算法是什么?每个订单将使用什么QuantityBBD? 在我的一阶示例中:

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,但不确定是否会阻止从其他会话读取相同的行。

那么,什么是正确的方法呢?

1 个答案:

答案 0 :(得分:0)

InnoDB(我假设您正在使用)支持行锁定,并且您可以使用SELECT ... FOR UPDATE来做到这一点。

您可以通过运行2个不同的脚本轻松地进行测试,一个尝试更新,另一个尝试选择,选择查询将等待更新完成。

我不确定您为什么要在此处插入记录,我想您的意思是UPDATE。