【发布时间】:2023-03-29 00:45:01
【问题描述】:
我需要从 DB2 数据库表中读取第一个启用的帐户并立即更新该列以禁用它。当服务器 1 读取和更新列时,其他服务器不应该能够读取同一行,因为我希望一个帐户一次只能由一台服务器使用。
这是我目前所拥有的......
帐户.java
Account{
private Long id;
private Character enabled;
.............
}
AccountRepository.java
public interface AccountRepository extends JpaRepository<Account, Long>{
Account findFirstByEnabled(new Character('Y'));
}
AccountServiceImpl.java
@Service
public class AccountServiceImpl {
@Autowrired
private AccountRepository accntRepository;
@Transactional
public Account findFirstAvaialbleAccount(){
Account account = accntRepository.findFirstByEnabled(new Character('Y'));
if(account != null)
{
account.setEnabled(new Character('N')); //put debug point here
account.save(proxyAccount);
}
return account;
}
}
但这不起作用..我在 findFirstAvaialbleAccount() 方法中放置了一个调试指针。我所期待的是,如果调试指针到达该行并等待我恢复执行,如果我直接在数据库上运行选择查询,则 sql 不应该执行。它应该只在我在服务器上恢复执行以完成事务后才执行。但是,直接在数据库上运行选择查询会立即给我完整的结果集。我在这里想念什么?如果重要的话,我正在使用 DB2。
【问题讨论】:
-
为什么您认为在 Java 程序上设置断点会阻止另一个程序执行查询?如果只有一个从表中读取的事务阻塞了所有其他事务,IBM 是否能够将 DB2 出售给任何人?
-
悲观日志记录是在数据库级别完成的。由于事务在服务器中挂起,DB2 不应允许任何其他客户端读取同一行
-
为什么?为什么在没有使用任何锁的情况下假设使用悲观锁?为什么它会阻止一个事务读取另一个事务读取的行。
-
是的,那是我的错误。我忘记在我直接针对 DB 运行的查询中输入“for update”。我从服务器运行的那个有它,但不是终端中的那个窗口..
标签: spring db2 spring-data spring-data-jpa