【问题标题】:Validation of an order订单确认
【发布时间】:2026-01-27 13:55:01
【问题描述】:

我有一个通过 Web 界面对仓库批发商进行销售、库存和付款的管理应用程序。特别是,当一个订单被执行时,它必须创建一个对应于每个订购了相应数量的产品的行。库存可用性的验证是在下订单时完成的。

考虑以下两种验证方式:

1) 在 OrderLine 表上使用触发器“BEFORE...ON INSERT”,对 Product 执行 SELECT 验证是否存在足够的 Stock。

2) 执行 SELECT...FROM OrderLine JOIN Product WHERE quant

我的问题是这两种选择中的哪一种更有可能?为什么?

谢谢

【问题讨论】:

  • 只需我的两分钱 - 在应用程序的业务逻辑层处理验证。
  • 我相信您要解决的问题是验证检查和数据插入之间的时间间隔。您应该能够利用具有适当隔离级别的事务来处理此问题。

标签: sql database postgresql join triggers


【解决方案1】:

您可能想要(未写的)第三个选项。

  1. 使用存储过程 (in PostgreSQL, a function) 下订单。在函数内部(可能)根据需要使用尽可能多的serializable transactions

即使您在应用程序层完成这项工作,您仍然需要在单个事务中完成所有检查和提交,可能在单个可序列化事务中。

根据您的应用程序,可序列化事务可能不适合您。一些在线供应商接受订单但不保证他们有足够的库存来完成订单。稍后,您可能会收到一封电子邮件,说有些东西已延期交货。 (只是需要记住的一点。)

General information about PostgreSQL transactions

【讨论】:

  • 尽管我认为您的回答是正确的。如果您只能在两个选项中进行选择,我给出您选择的选项是什么?
  • @fegol:他们都没有完成你想要的工作——确保现有库存用于完成这个订单而不是其他订单。