2017-09-05 114 views
0

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

这是我迄今为止..

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; 
    } 
} 

但这ISN不行ng ..我已经把调试指针放在findFirstAvaialbleAccount()方法中。我期望的是,如果调试指针到达那条线并等待我恢复执行,如果我直接在数据库上运行select查询,sql就不应该执行。它应该只在我恢复服务器上的执行之后执行,以便事务完成。但是,直接在数据库上运行select查询会立即为我提供完整的结果集。我在这里错过了什么?如果它很重要,我正在使用DB2。

+0

为什么你认为在Java程序中放置一个断点应该可以防止另一个程序执行查询?如果只有一个从表中读取的交易阻止了所有其他交易,那么IBM是否能够将DB2出售给任何人? –

+0

悲观日志记录是在数据库级完成的。在服务器中挂起的事务中,DB2不应允许任何其他客户端读取同一行 – RKodakandla

+0

为什么?为什么你假设在没有使用任何锁的情况下使用悲观锁定?为什么它会阻止一个事务**读**一行另一个事务**读取**。 –

回答

0

回答我自己的问题......我有不正确的选择对数据库运行的SQL。如果我使用“select .. for update”运行select sql,那么执行等待,直到我在服务器上启动恢复并且事务完成。

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

select * from MYTABLE where ENABLED ='Y';

SQL 2 - 此等待,直到从服务器交易完成时(可能会超时,如果我不打恢复速度不够快)

SELECT * FROM MYTABLE启用该功能=“Y” 取第一行1只有rs使用并保持更新锁;