2016-05-31 51 views
1

我正在实施在线商店。选择更新等待网络操作?

我想知道是否可以使用select for update锁定订单记录。
以下是我认为锁定的订单状态更改。

  • 支付处理:买受人支付的订单,订单从去到waiting-for-paymentpaid
  • 订单取消:买方或卖方取消
  • 为了确认顺序:卖家确认订单,使买方不能取消订单

例如,当买方取消订单,卖方确认订单。
如果没有锁定,买方可能会执行取消操作,卖方可能会同时确认订单。
但随着锁定,买方取消或卖家确认。

到目前为止,我的问题是这样的:即使它只是表中的一行,锁定等待网络操作(支付处理)的订单实例会有太大的性能开销?

我正在使用postgresql

回答

1

您正在使用数据库锁定机制来实现业务逻辑。这是一个坏主意。

取而代之的是引入[交易状态]标志字段并对其进行分析以应用业务逻辑。这可以在业务场景中实现灵活性,因为您可以拥有适用于每个州的多个不同的交易状态和复杂的业务规则。

更好的是仍然使用事务处理历史记录表,其中包含事务状态随时间变化的完整日志。

更新: 只有与历史记录一致,状态才会更改。如果付款失败,则无法标记已付订单并将其回滚。

对于每一项更改,都应该有一个需要在操作发生之前验证的需求清单。检查有没有物品客户确认收货地址总价格大于之前要求付款的

有顺序状态变化的无限场景,并且每个状态都有一个单独的代码,也包括整个历史是不切实际的。为了确认付款或者未送达或从供应商任意数量的其他情形到达预订购项目客户退货更换后才能成为可供调度。

更好地跟踪每个订单的订单状态完整历史记录以分析业务情景并相应地选择最佳的下一步行动。

+0

我不太明白你的答案。“最好还是使用事务处理历史记录表,记录交易状态随时间变化的完整日志”你能否给我提供一个链接,让我可以更好地理解这句话? – eugene

+0

我的猜测是,你创造了状态变化的历史。并且在你改变状态之后,你查看以前的状态改变并且提出错误并且回滚,如果当前状态改变从先前状态无效的话。想知道我可以如何使用历史表..? – eugene