programing

Oracle 시퀀스 트랜잭션 기능

starjava 2023. 6. 26. 20:45
반응형

Oracle 시퀀스 트랜잭션 기능

시퀀스에서 숫자(최소와 최대 사이의 숫자여야 함)를 엔티티(PK가 아님)에 대해 필드를 설정하는 특정 비즈니스 시나리오가 필요합니다.

저는 다음과 같이 시퀀스를 정의했습니다.

CREATE SEQUENCE MySequence
  MINVALUE 65536 
  MAXVALUE 4294967296 
  START WITH 65536
  INCREMENT BY 1
  CYCLE
  NOCACHE
  ORDER;

자바 코드에서 나는 다음과 같은 순서로 숫자를 검색합니다.

select mySequence.nextval from dual

제 질문은:

내가 이걸 "라고 부르면,select mySequence.nextval from dual트랜잭션에서 그리고 동시에 다른 트랜잭션에서 동일한 방법을 (반복 요청)이라고 합니다. 시퀀스에 의해 반환되는 값이 서로 다른 것이 확실합니까?

첫 번째 거래에서 커밋되지 않은 값을 읽도록 하는 것이 가능하지 않습니까?

왜냐하면 시퀀스와 시퀀스를 증분하는 일반 테이블을 사용하지 않았을 것이라고 가정하면, traactinality가 기본 "READ COMMITED"였다면 트랜잭션 2는 동일한 값을 읽을 수 있었을 것입니다.

답은 아니오입니다.

오라클은 시퀀스별로 생성된 숫자가 다르다는 것을 보장합니다.병렬 요청이 실행되더라도 RAC 환경 또는 롤백 및 커밋이 혼합됩니다.

시퀀스는 트랜잭션과 관련이 없습니다.

다음 문서를 참조하십시오.

CREATE SEQUENCE 문을 사용하여 여러 사용자가 고유 정수를 생성할 수 있는 데이터베이스 개체인 시퀀스를 만듭니다.시퀀스를 사용하여 기본 키 값을 자동으로 생성할 수 있습니다.

시퀀스 번호가 생성되면 트랜잭션 커밋 또는 롤백과 관계없이 시퀀스가 증분됩니다.두 사용자가 동시에 동일한 시퀀스를 증분하는 경우, 다른 사용자가 시퀀스 번호를 생성하고 있기 때문에 각 사용자가 획득한 시퀀스 번호에 공백이 있을 수 있습니다.한 사용자는 다른 사용자가 생성한 시퀀스 번호를 획득할 수 없습니다.한 사용자가 시퀀스 값을 생성한 후에는 다른 사용자가 시퀀스 값을 증가시키는지 여부에 관계없이 해당 사용자가 해당 값에 계속 액세스할 수 있습니다.

시퀀스 번호는 테이블과 독립적으로 생성되므로 동일한 시퀀스를 하나 또는 여러 테이블에 사용할 수 있습니다.개별 시퀀스 번호는 생성되어 최종적으로 롤백된 트랜잭션에 사용되었기 때문에 건너뛴 것으로 보일 수 있습니다.또한 한 명의 사용자가 다른 사용자가 동일한 시퀀스에서 그림을 그리고 있다는 사실을 인식하지 못할 수도 있습니다.

Oracle은 시퀀스 번호가 다르다는 것을 보장합니다.트랜잭션이 롤백되더라도 시퀀스는 '사용'되고 다른 쿼리로 재발행되지 않습니다.

편집: Cris의 코멘트에 "공백 없음" 관련 요구 사항이 명시된 후 추가 정보 추가

간격이 없는 일련의 숫자에 대한 요구사항인 경우 트랜잭션이 롤백되거나 데이터베이스가 다시 시작되거나 기타 시나리오가 발생할 때 간격이 발생하므로 Oracle 시퀀스는 적합한 솔루션이 아닐 수 있습니다.

시퀀스는 주로 간격 및 트랜잭션 컨텍스트 제약 조건과 관계없이 고유 번호(예: 기본 키)를 위한 고성능 생성 도구로 사용됩니다.

설계/비즈니스/감사 요구사항이 모든 수를 고려해야 하는 경우 대신 트랜잭션 컨텍스트 내에서 미리 정해진 수를 사용하는 솔루션을 설계해야 합니다.이는 멀티 스레드 환경에서는 까다롭고 성능/잠금 문제가 발생하기 쉽습니다.차이가 중요하지 않도록 요구사항을 재정의하는 것이 좋습니다.

sequence.nextval동시 요청에 대해 동일한 값(주기 전)을 반환하지 않습니다.다음 URL을 확인해야 합니다.

http://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm#sthref883

불행하게도 당신은 당신 자신이 '자신의 바퀴'인 트랜잭션 순서를 구현해야 합니다.이 방법은 상당히 간단합니다. sequence_name varchar2, value, min_value number, max_value number, need_cycle char와 같은 테이블을 만들고 '업데이트 대기를 위해 시퀀스 테이블에서 변수로 값 선택(또는 지금 대기 - 시나리오에 따라 다름)'을 혼란스럽게 합니다.업데이트 설정 값 = 이전 단계의 변수 + 1을 실행한 후 sequence_name = 시퀀스 이름을 실행하고 클라이언트 측에서 커밋 문을 실행합니다.바로 그겁니다.

언급URL : https://stackoverflow.com/questions/12104407/oracle-sequence-transactionality

반응형