【问题标题】:Warehouse managment system on PHP+MySQLPHP+MySQL 仓库管理系统
【发布时间】: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 件。

计算的最佳方法和算法是什么,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,但我不确定它是否会阻止从其他会话中读取相同的行。

那么,得到这个的正确方法是什么?

【问题讨论】:

标签: mysql transactions locking


【解决方案1】:

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

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

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

【讨论】:

  • 但我不需要更新任何行。我只需要插入新的,但我可以在脚本中计算正确的字段QuantityBBD
  • 插入,因为我需要保留历史记录。
猜你喜欢
  • 2014-05-27
  • 2018-06-25
  • 1970-01-01
  • 2019-06-25
  • 2012-09-23
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多