"lock" 和 "unlock" 是否可以在 Spring Boot 中以两种不同的方法使用悲观锁?

Is it possible to "lock" and "unlock" a pessimistic lock in two different methods in Spring Boot?

我目前有在自动售货机项目中使用悲观锁的需求。当超过 1 个人在选择他们的产品时,我想使用悲观锁来防止两个人选择相同的产品。我的项目是 Java, Spring Boot.

是否可以在一个方法调用中执行悲观锁"lock",而在另一个方法调用中执行悲观锁"unlock"? ("lock"流程在用户确认商品时执行,"unlock"流程在用户购买商品或希望重新选择商品时执行。)或者有没有更好的这个问题的解决方案?

LockAPI允许一种方法获取锁,另一种方法释放锁。

Lock 的特定实现可以允许一个线程获取锁,而另一个线程释放锁。但是 ReentrantLock 没有。每个 Lock 实现的 javadoc 应该记录这方面的内容。


但是,我认为您根本不应该使用 Java 语言锁对此进行建模;原始对象锁或 Lock。这些旨在为某些代码块提供互斥,从而控制对共享数据结构的访问和更新。

我认为您应该将其建模为“保留”或“保留”,如下所示:

  • 用户在select产品
  • 时获得保留
  • 在以下情况下释放保留:
    • 用户购买了产品
    • 用户取消交易
    • 用户完成交易的时间过长
    • 用户...离开

因此保留可能包括:

  • 持有编号
  • 产品标识符
  • 一个产品数量
  • 用户 ID 或会话 ID
  • 到期时间戳

如果“保全”存储在您的数据库中,将最容易实施。

您只需要保持产品的持有数量小于或等于该产品的未售出数量这一不变性。

最后,您需要一些东西来自动解除已到期的保留。以及处理用户在保留期满后尝试购买商品的情况。