Java 有没有可能;锁;及;解锁";Spring Boot中两种不同方法中的悲观锁?
我目前需要在我的自动售货机项目中使用悲观锁。当超过一个人在选择他们的产品时,我想使用悲观锁来防止两个人选择相同的产品。我的项目是Java,SpringBootJava 有没有可能;锁;及;解锁";Spring Boot中两种不同方法中的悲观锁?,java,spring-boot,pessimistic-locking,Java,Spring Boot,Pessimistic Locking,我目前需要在我的自动售货机项目中使用悲观锁。当超过一个人在选择他们的产品时,我想使用悲观锁来防止两个人选择相同的产品。我的项目是Java,SpringBoot 我是否可以在一个方法调用中执行悲观锁的“锁”,并在另一个方法调用中以某种方式“解锁”悲观锁?(当用户确认产品时执行“锁定”过程,当用户支付产品费用或希望重新选择产品时执行“解锁”过程。)或者有更好的解决方案吗?锁定API允许一种方法获取锁定,另一种方法释放锁定 Lock的特定实现可以允许一个线程获取锁,另一个线程释放锁。但是,Reentr
我是否可以在一个方法调用中执行悲观锁的“锁”,并在另一个方法调用中以某种方式“解锁”悲观锁?(当用户确认产品时执行“锁定”过程,当用户支付产品费用或希望重新选择产品时执行“解锁”过程。)或者有更好的解决方案吗?锁定API允许一种方法获取锁定,另一种方法释放锁定
Lock
的特定实现可以允许一个线程获取锁,另一个线程释放锁。但是,ReentrantLock
没有。每个Lock
实现的javadocs都应该记录这一方面
然而,我认为您根本不应该使用Java语言锁对此进行建模;基本体对象锁定或
锁定
。它们旨在为某些代码块提供互斥,从而控制对共享数据结构的访问和更新
我认为您应该将其建模为“保留”或“保留”,如下所示:
- 用户在选择产品时获得保留
- 当出现以下情况时,解除暂挂:
- 用户购买产品
- 用户取消交易
- 用户花费的时间太长,无法完成事务
- 用户。。。走开
- 身份证
- 产品标识符
- 产品数量
- 用户id或会话id
- 到期时间戳
最后,您需要一些东西来自动释放已到期的保留。以及处理用户在持有过期后试图购买物品的情况。请告诉我们您使用的是什么类来实现锁定。但我必须说,这整件事有“深思熟虑”的味道。一台普通的现实生活中的自动售货机一次只能为一个人提供服务。如果有多个人,他们会排成一行……在这种情况下,所有产品都由在线界面选择,因此支持多用户使用。谢谢@StephenCSo,它不是自动售货机。这是一个标准的网站,你可以在那里买东西。是的,这是一个连接到实体自动售货机的标准网站。对于
Lock
api,您是指@Lock
注释还是java语言中的标准Lock
。它还提供代码区域上的互斥。这里我尝试锁定/解锁sql数据库中的行,而不是锁定程序中的变量。似乎java.util.concurrent.locks
更多的是用于锁定线程,而不是锁定数据库似乎为了保护数据库而阻止了我尝试执行的操作(锁定和释放SQL表中的行)。在单独的表中存储锁的方法是我最后使用的方法。Thanks@StephenC