【问题标题】:Spring Data JPA - Select row for updateSpring Data JPA - 选择更新行
【发布时间】: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


【解决方案1】:

回答我自己的问题...我对数据库运行的 Select SQL 不正确。如果我使用“select.. for update”运行 select sql,则执行将等待,直到我在服务器上点击 resume 并且事务完成。

SQL 1 - 即使来自服务器的事务未完成,它也会立即执行。

从 MYTABLE 中选择 * 其中 ENABLED = 'Y';

SQL 2- 这将等待来自服务器的事务完成(如果我没有足够快地点击恢复,它可能会超时)

从 MYTABLE 中选择 *,其中 ENABLED = 'Y' 仅使用 rs 获取前 1 行并保持更新锁;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-05-08
    • 2019-09-05
    • 2020-01-23
    • 2016-11-10
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多