2010-03-26 7 views
1

특정 삽입에 대한 액세스를 동기화하고 싶습니다. 따라서 여러 응용 프로그램에서이 "하나의"삽입을 실행하면 삽입은 한 번에 하나씩 발생해야합니다. 동기화의 이유는이 엔티티의 인스턴스가 하나만 있어야한다는 것입니다. 여러 응용 프로그램이 동일한 엔티티를 삽입하려고하면 하나만 성공하고 다른 하나는 실패해야합니다. 하나의 옵션으로 복합 엔티티를 생성하는 것이 고려되었습니다.이 고유 키는 엔티티를 고유하게 식별하고 고유 제한 조건에 의존합니다. 어떤 이유로 dba 부서는이 아이디어를 거부했습니다. 내 마음에 온 다른 옵션은 삽입에 대한 저장된 proc를 생성하는 것이었고, 저장된 proc이 전역 잠금을 얻을 수 있다면 동일한 애플리케이션에 동일한 proc을 호출하는 여러 애플리케이션이 있었지만 별도의 데이터베이스 세션에서는 저장된 proc 글로벌 락을 취득 할 수있어 인서트를 직렬화 할 수 있습니다. 제 질문은 오라클 버전 10/11의 저장된 proc를 사용하여 이러한 잠금을 얻는 것이고 문서에 대한 포인터가 도움이 될 것입니다.프로세스 전반에 걸친 Oracle 글로벌 잠금

+0

DBA 그룹이 고유 한 제약 조건을 갖는 주요 이유 중 하나 인 "고유 한 제약 조건을 사용하여 그룹 열에 대한 액세스를 직렬화하지 마십시오"라고 말한 이유는 상상할 수 없습니다. 세션 A가 세션 B, C 및 D를 차단하는 행을 삽입하는 경우 세션 B-D가 세션 A가 블록 문을 완료 또는 롤백하기를 기다리는 동안 중단됩니다. 또는 데이터 일관성을 위해 고유 색인이 필요하다는 것을 주장하면 다리를 놓을 수 없습니다. –

답변

1

삽입 된 엔티티를 고유하게 만들려면 Oracle에서 어떤 것도 serialize 할 필요가 없습니다. 고유 한 제한 조건이 완벽하게 설계되어이 용도로 적합합니다. Oracle은 하나의 엔티티 만 삽입되도록하는 데 필요한 모든 잠금을 처리합니다.

dba 부서가 고유 한 제약 조건에 대한 아이디어를 거부 한 이유를 생각할 수 없습니다. 이는 매우 기본적인 것입니다. 제안 된 솔루션의 다른 측면을 거부했을 수도 있습니다.

어떤 이유로 액세스를 직렬화하려면 (이유가 무엇인지 생각할 수 없다), (a) 테이블의 모든 DML을 직렬화하는 전체 테이블을 잠글 수 있습니다. 또는 (b) DBMS_LOCK을 사용하여 사용자 이름이 지정된 잠금을 얻습니다. 잠금을 얻는 특정 프로세스 만 직렬화합니다. 두 옵션 모두 장점과 단점이 있습니다.

관련 문제