【发布时间】:2019-12-11 12:23:54
【问题描述】:
我正在开发仓库系统,该系统可以管理具有不同 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,但我不确定它是否会阻止从其他会话中读取相同的行。
那么,得到这个的正确方法是什么?
【问题讨论】:
-
550和70从何而来?
-
@Strawberry 550 和 70 - 只是来自仓库的订单数量。举个例子。
标签: mysql transactions locking