2014-09-22 6 views
0

Oracle 데이터베이스 (11g 릴리스 2)로 작업하고 있습니다. 동시 다음을 수행 다중 연결을 상상해 : 특정 값이 고유 값의 테이블에 존재하는 경우 값이 존재하지 않는 경우Oracle 데이터베이스 트랜잭션이이 시나리오에서 도움이 될 수 있습니까?

  1. 시작 트랜잭션이
  2. 확인이
  3. 를 트랜잭션을 커밋 삽입

충돌을 방지하는 유일한 방법은 다른 연결이 현재 4 단계 시퀀스를 수행하는 동안 연결이 위의 4 단계 시퀀스를 수행하는 것을 차단하는 것입니다. ence.

트랜잭션이 Oracle에서 이러한 종류의 광범위한 잠금/차단을 달성 할 수 있습니까?

이 시나리오를 가장 잘 처리하는 방법에 대한 답변과 조언을 미리 보내 주셔서 감사합니다.

답변

1

고유 검사 제약 조건을 추가하고 예외 처리기를 구현하여 다음 시퀀스를 얻은 다음 다시 시도하십시오.

이것은 pl/sql을 사용한다고 가정합니다.

이것은 또한 순서 UPDATE 모두가 다른 세션에서 읽어 차단하기위한 TABLE_NAME FROM 2. SELECT *의 틈을 보장하지 않습니다 캐시 크기 1로, 오라클 시퀀스를 사용하는 것입니다 대체 ...

+0

아 예, 고유 검사 제약 조건 - 중복을 방지하지만 피할 수없는 예외 (btw 값은 클라이언트 측에서 발생하는 텍스트 문자열이므로 시퀀스가 ​​여기에서 작동하지 않음)를 방지하지는 않습니다. 나는 예외를 모두 피하기를 희망했다. 오라클이 읽기 차단 옵션을 사용하여 트랜잭션을 직렬화 할 수 있다면 좋지 않을 것입니다. – misha256

+1

그러면 select 문에서 '업데이트'를 시도 할 수 있습니다. where 절을 생략하여 전체 테이블을 잠 그거나 where 절의 행을 지정하여 특정 행을 잠글 수 있습니다. –

+0

Meh, 'for update'가 유망 해 보이지만 읽기를 차단하지는 않습니다. 즉, 여전히 2 단계를 수행하는 데있어 내 애플리케이션을 방해하지는 않습니다. 오라클의 독자는 차단할 수 없습니다. 클라이언트 측 예외를 잡아야 할 수도 있습니다. 별거 아니 었어. 내가 좋아할만큼 깔끔하고 정돈되지 않았다. – misha256