Spring Data JPA - 选择要更新的行

时间:2017-09-05 21:16:25

标签: spring db2 spring-data spring-data-jpa

我需要从DB2数据库表中读取第一个启用的帐户,并立即更新列以禁用它。当服务器1正在读取和更新列时,没有其他服务器应该能够读取同一行,因为我希望一次只有一个服务器使用一个帐户。

这是我到目前为止所拥有的......

Account.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()方法中放了一个调试指针。我期待的是,如果调试指针到达该行并等待我继续执行,如果我直接在数据库上运行select查询,则不应该执行sql。它应该只在我在服务器上恢复执行后才执行,以便完成事务。但是,直接在数据库上运行select查询会立即给出完整的结果集。我在这里错过了什么?如果重要的话,我正在使用DB2。

1 个答案:

答案 0 :(得分:0)

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

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

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

SQL 2-这等待直到服务器的事务完成(如果我没有足够快地命中恢复,它可能会超时)

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