2017-09-05 3 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 여기서 ENABLED = 'Y'; 서버에서 트랜잭션이 완료 될 때까지

SQL 2이

선택 * MYTABLE에서 Enabled = 'Y' 가져 첫번째 1 개 행을 (내가 충분히 빠른 다시 공격하지 않으면 아마 시간이 초과됩니다) 대기 rs만을 사용하고 업데이트 잠금을 유지합니다.