2011-01-26 4 views
2

고유 한 제한 조건이 해당 열 중 하나에 정의 된 데이터베이스 테이블이 있습니다. 또한 여러 스레드가있는 메시지 처리 시스템이 있습니다. 메시지가 소비됨에 따라 두 메시지가 동일한 값 (동일한 고유 제한 조건이 정의 된 열 값)을 가진 동일한 엔티티를 포함하는 경우가 있습니다. 따라서 코드에서 서비스 레이어는 먼저이 고유 필드를 사용하여 데이터베이스를 쿼리하여 (이름이 지정된 최대 절전 모드 쿼리를 통해) 레코드가 먼저 있는지 확인합니다. 그렇지 않으면 새 레코드를 삽입합니다. 이 고유 한 필드가있는 레코드가 이미 존재하는 경우 레코드를 삽입하는 대신 레코드를 업데이트하고 다른 테이블에 자식 레코드를 삽입합니다.최대 절전 모드를 사용하여 고유 한 제약 조건을 위반하는 것을 어떻게 피할 수 있습니까?

두 번째 스레드가 레코드가 아직 없다고 생각하여 삽입하려고 시도하고 있습니다. 그러나 이번에는 첫 번째 스레드가 이미 레코드를 성공적으로 삽입했습니다. 따라서 유일한 제약 조건 위반에 대해서는 예외가 발생합니다. 최대 절전 모드/오라클 솔루션을 사용하여 이러한 상황을 처리하는 가장 좋은 방법은 무엇입니까? 어떤 종류의 자물쇠 옵션이 필요합니까? 감사.

+0

Oracle/Hibernate 솔루션을 원한다고 명시합니다. 메시징 시스템을 변경하여 동기화 할 수없는 이유가 있습니까? 당신이 Hibernate 나 Oracle 내에서보다 훨씬 더 간단하게 이것을 처리 할 수 ​​있도록 당신이 수행하는 방식을 코딩 한 것처럼 들립니다. –

답변

1

이 경우 롤백을 피하려는 시도는 과도한 잠금이 필요하기 때문에 MVCC (특히 Oracle에서 사용)의 정신에 반하는 것입니다.

업데이트를 수행하기 위해 다른 트랜잭션을 시작하여 삽입의 롤백에 대응하는 것이 더 좋을 것이라고 생각합니다.

관련 문제