不,这不是一个好的设计,因为它很容易导致滥用和问题。如果用户(竞争对手?)在整个月内锁定了您的所有产品怎么办?如果另一个人在他/她的购物车里装满了产品,然后觉得钱太多,就关掉了他/她的设备怎么办?
最好的选择是:
1) 告诉用户每种产品的可用性,但也告诉他/她如果没有尽快下订单,它可能会消失。这也应该激励销售。在付款页面后锁定/解锁您的产品,即当有业务承诺操作时。如果可用数量不再足够,请将用户返回上一页,将数量更新为可用的数量。
2) 与 1) 类似,但您也可以不时更新可用性。或发送警告,例如“您购物车中某些商品的库存不足”。同样,这也可以促进销售。
3) 在物品被移动到购物车时保留(“锁定”)物品,但不是永远。锁定一定时间后释放物品。随时通知用户。超时可以是整个购物车或每个项目。
需要注意的是,上面提到的任何“锁”都是“业务锁/预留”。它不需要以锁或任何其他特定技术方案的形式实现。比如上面的 3) 可以通过添加字段locked_by
和来实现locked_until
。当您检查/更新/操作这些字段时,您可能需要在“技术锁”内进行。检查/更新完成后,技术锁被释放。但是,“业务锁定”可能仍然存在,因为locked_until
尚未过去,并且任何其他代码将检查此字段以考虑产品是否可用。为什么?因为业务规则要求如此(不是因为存在技术锁定,实际上没有)。
“技术锁”应该很快。“业务锁”可以更长(但永远不会永远;总是为它们定义时间限制)。
很难用您提供的非常少的信息来判断您是否应该将“in Java”锁定在“in the database”上。例如,您是否使用实体 Bean?您的容错要求是什么?等等。
也就是说,在一般情况下,最好在数据库中保留锁(只要它们是“业务锁”),主要原因如下:
- 持久性(在电源故障的情况下)。您还应该提供一种恢复购物车的机制。也许还将它们存储在数据库中?
- 与其他环境(即企业 ERP 或完整系统)交互的能力。