2016-09-20 1 views
0

이것은 내 문제입니다.SqlServer JDBC RowLock

테이블에 IDS 목록이 있습니다. 하나 이상의 작업이 동시에 IDS를 읽고 ID를 사용하여 다른 데이터를 검색하고 일부 파일을 작성해야합니다. 각 작업은 다른 IDS 집합에서 작동해야합니다. 분명히 뭔가 잘못되었을 경우 다른 작업에서 파일을 다시 쓰려고 롤백해야합니다.

Java 1.8 (Spring Boot Framework)과 SQLServer 2008 R2를 Microsoft JDBC 드라이버 4.1과 함께 사용합니다. 내 솔루션에서

각 작업은 트랜잭션을 열고 잠금 모든 것이 잘 가까이 작동하는 경우는 그 다음 다른 작업을 수행 할 수 IDS의 목록을 사용 ROWLOCK

DefaultTransactionDefinition dtd = new DefaultTransactionDefinition(); 
dtd.setIsolationLevel(DefaultTransactionDefinition.ISOLATION_READ_COMMITTED); 
dtd.setName(taskName); 
TransactionStatus ts =transactionManager.getTransaction(dtd); 

List<Long> result = jdbc.query("select top 3 * from D_TEST where STATUS = 0 order by 1",new LongExtractor()); 

for(Long l:result){ 
     jdbc.update("update D_TEST with (ROWLOCK) set STATUS = 1 where ID_ROW = "+l.toString()); 
} 

으로 업데이 트를 수행하여 작업 할 기록 그렇지 않으면 트랜잭션이 롤백됩니다.

다른 작업이 IDS 집합을 묻는 메시지를 표시 할 때 실행 중일 때 다른 작업이 시작되면 잠긴 메시지가 수신되지 않습니다.

쿼리가 행뿐만 아니라 전체 테이블을 잠그는 문제. 내 오류는 어디에 있습니까? 일부 행만 잠글 수 있습니까?

누군가가 (SQL Server - Row Lock with JDBC) 차단 수준을 ISOLATION_READ_UNCOMMITTED으로 변경하겠다고 제안했으나이 경우 첫 번째 작업에서 업데이트되는 레코드도 읽었습니다. 또한이 격리 수준에서는 두 번째 작업이 여전히 중단되어 첫 번째 트랜잭션이 끝날 때까지 대기합니다.

+0

상위 3 개 레코드를 요청하더라도 테이블 잠금을 유발하는 것으로 주문했을 것입니다. 정렬 기준에 대한 색인이 있습니까? – SqlACID

답변

0

는 지금까지 내가 전에 그것을 한 데 알고, 당신은 행 잠금을 강제로 잠금 에스컬레이션 및 SQLSERVER에서 인덱스에 페이지 잠금 모두 해제해야합니다.

그러나 결과적으로 그 결과가 있습니다.

여기에 참조 용으로 link이 있습니다. 희망이 도움이됩니다.