2014-09-18 4 views
1

나는 이것이 최대 절전 모드에 처음이다 이것은 stackoverflow 내 첫 게시물입니다. 하이버 네이트 3.3.2 GA와 MySQL을 DB로 사용하고 있습니다.최대 절전 모드를 사용하여 MySql DB 테이블의 행 수준 잠금

나는 상태 = 'N'을 가지고있는 DB 테이블에 대한 기록을 읽고있다 :

여기 내 질문이다.

List sendSmsPropertiesList=hbSession.createQuery("from TSendSms where status='N' ").setMaxResults(1).list(); 

는 I 상태로 DB에서 레코드를 가져 SQL 이상 사용하여 동일한 테이블에 액세스하는 2 개 스레드가 = 'N'은 (예를 들어, 상태 3 개 기록 = 'N', 제 스레드 페치가 있는지 첫 번째 레코드와 두 번째 스레드가 두 번째 레코드를 가져와야 함). 그러나 둘 다 동일한 레코드를 가져오고 있습니다 (첫 번째 레코드). 여기에 한 번 쓰레드를 가져 오면 테이블 행에 자물쇠가 있어야합니다. 두 번째 쓰레드가 오면 두 번째 행으로 가야합니다.

위의 예를 도와 주시겠습니까?

미리 감사드립니다.

+0

잠금은 행을 숨기지 않습니다. 잠금이 해제 될 때까지 스레드를 차단합니다. 당신이 묘사 한 바에 따르면 자물쇠는 필요 없다. –

+0

안녕하세요, JB Nizet, 예, 현재 스레드가 트랜잭션을 완료 할 때까지 다른 스레드가 해당 행을 읽지 못하도록 차단해야합니다. – anil

+0

http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Query.html#setLockMode(java.lang.String, org.hibernate.LockMode) –

답변

-1

상태를 'Y'으로 수정하거나 동일한 레코드가 처리되도록 어딘가에 업데이트하십시오. 그것은 코드와 최선의 방법으로 그것은 당신이 그것을 수정할 수 없다면 처리되는 상태를 업데이 트하는 것 같다 다음 동일에 대한 새 열을 추가하십시오.

+0

감사 Nirajkumar. 일단 처리되면 레코드 상태를 'Y'로 업데이트해야합니다. 두 스레드가 페치 할 때 두 번 처리 중입니다. – anil

+0

문제가 해결되면 솔루션을 수락하십시오. – nirajkumar

+0

안녕하세요 Nirajkumar, 어떤 식 으로든 처리 된 레코드가 끝나면 상태를 'Y'로 업데이트하고 있습니다. 여기서 레코드는 상태를 'Y'로 업데이트하기 전에 두 개의 스레드로 액세스합니다. 하나의 스레드가 하나의 레코드에서 작동하도록 허용해야합니다. – anil

관련 문제