안녕하세요? DB 초보 질문드립니다.
제가 하고자 하는 것은, 오라클에서 시퀀스 관리인데 오라클 고유기능인 SEQUENCE를 사용하지 않고 하는 것입니다.
Sequence_save라는 테이블을 따로 만들어서 해보고자 합니다 .
Sequence_save라는 테이블의 구조는 다음과 같습니다.
max_sequence number,
year number,
chasu number
여기에서
select max_sequnece from Sequence_save where year=2017 and chasu=1 for update
이를 통해 트랜잭션을 잡아놓고,
이 시퀀스를 사용한 뒤에
update Sequence_save set max_sequnece = max_sequnece+ 1 where year=:year and chasu=:chasu commit
이렇게 하면 트랜잭션 점유 문제가 발생하진 않을까요?
고수님들 도와주세요.
위에서 begin end 등은 생략했다고 봐주시면 감사하겠습니다 !
제가 궁금한 것은 동시에 여러 사용자가 Sequence_save 테이블에 접근시 특정 sequence를 조회할 때 첫 번째 사람이 선점하고 sequence를 1 증가시키고 커밋하면 그 다음 사람이 기다렸다가 증가된 sequence 값을 조회하는 것을 하고 싶습니다.
더불어 commit과 rollback만 잘하면 데드락 걸리는 염려는 안해도 되나요?
네 위와 같이 사용자 시퀀스 사용 가능합니다.
이 시퀀스를 "사용"한 뒤에 커밋한다는 표현이 있는데.
"사용"의 의미가 뭔지?
전체 트렌젝션을 모두 마친후에 커밋한다?라는 의미라면?
이렇게 하면 안됩니다. 최대한 락을 짧게 가져가야 하므로
- 비추 : 시퀀스 락 > 시퀀스 사용 업무트렌젝션 완료 > 시퀀스 업데이트 > 커밋 (X)
- 추천 : 시퀀스 락 > 시퀀스 업데이트 > 커밋(락 즉시 해제) > 시퀀스 사용 업무트렌젝션 완료 > 커밋 (O)
감사합니다