Java 有没有可能;锁;及;解锁";Spring Boot中两种不同方法中的悲观锁?

Java 有没有可能;锁;及;解锁";Spring Boot中两种不同方法中的悲观锁?,java,spring-boot,pessimistic-locking,Java,Spring Boot,Pessimistic Locking,我目前需要在我的自动售货机项目中使用悲观锁。当超过一个人在选择他们的产品时,我想使用悲观锁来防止两个人选择相同的产品。我的项目是Java,SpringBoot 我是否可以在一个方法调用中执行悲观锁的“锁”,并在另一个方法调用中以某种方式“解锁”悲观锁?(当用户确认产品时执行“锁定”过程,当用户支付产品费用或希望重新选择产品时执行“解锁”过程。)或者有更好的解决方案吗?锁定API允许一种方法获取锁定,另一种方法释放锁定 Lock的特定实现可以允许一个线程获取锁,另一个线程释放锁。但是,Reentr

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


我是否可以在一个方法调用中执行悲观锁的“锁”,并在另一个方法调用中以某种方式“解锁”悲观锁?(当用户确认产品时执行“锁定”过程,当用户支付产品费用或希望重新选择产品时执行“解锁”过程。)或者有更好的解决方案吗?

锁定API允许一种方法获取锁定,另一种方法释放锁定

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


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

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

  • 用户在选择产品时获得保留
  • 当出现以下情况时,解除暂挂:
    • 用户购买产品
    • 用户取消交易
    • 用户花费的时间太长,无法完成事务
    • 用户。。。走开
因此,搁置可能包括:

  • 身份证
  • 产品标识符
  • 产品数量
  • 用户id或会话id
  • 到期时间戳
如果“holds”存储在数据库中,那么它将最容易实现

您只需要保持不变,即产品的保留数量小于或等于该产品的未售出商品数量


最后,您需要一些东西来自动释放已到期的保留。以及处理用户在持有过期后试图购买物品的情况。

请告诉我们您使用的是什么类来实现锁定。但我必须说,这整件事有“深思熟虑”的味道。一台普通的现实生活中的自动售货机一次只能为一个人提供服务。如果有多个人,他们会排成一行……在这种情况下,所有产品都由在线界面选择,因此支持多用户使用。谢谢@StephenCSo,它不是自动售货机。这是一个标准的网站,你可以在那里买东西。是的,这是一个连接到实体自动售货机的标准网站。对于
Lock
api,您是指
@Lock
注释还是java语言中的标准
Lock
。它还提供代码区域上的互斥。这里我尝试锁定/解锁sql数据库中的行,而不是锁定程序中的变量。似乎
java.util.concurrent.locks
更多的是用于锁定线程,而不是锁定数据库似乎为了保护数据库而阻止了我尝试执行的操作(锁定和释放SQL表中的行)。在单独的表中存储锁的方法是我最后使用的方法。Thanks@StephenC