일련번호 채번시에 한꺼번에 여러TR로 인해 채번이 잘안되네요. 0 3 4,029

by 강민철 [Oracle 기초] [2012.01.03 14:20:31]



안녕하세요.
일하다가 질문이 있어서요. ^^ 새해복많이 받으세요.
전문이 오면 insert를 해야합니다.
현재 일련번호 max값을 테이블에서 select 한 다음  insert를 합니다.
전문이 여러개가 쭉쭉 들어오면 한꺼번에 처리를 합니다. 여기서 문제가 발생합니다.
배치가 ap(application서비스)를 콜하면 처음 1번전문이 들어오고
'select max(seq) from  전문테이블' 를 찾아와서
insert문에 컬럼에 넣는데...
select시 max(seq)가 10번이라면 1번전문이 제대로 insert되면 11번으로 들어가겠죠?

2번전문이 일찍들어와서 1번전문insert직전이라 max(seq)가 10으로 조회가 되는겁니다.
오라클시퀀스는 현재 쓰지 못하구요 최선의 방법으로 insert시에 max를 구해서 하면 좋은데
그마저도 좀 힘든상황입니다.

DB Rock을 걸면 insert나 delete update시에 다른사람의 액션(수정,삭세,입력)이 불가하게 되는걸로 아는데
저렇게 select시에 동시에 같은값을 조회하게되면 어떻게 수정을 해야하는지 궁금합니다.
select 시에는 DB Rock이 안걸리는것 맞죠?
ㅠㅠ 해결방안이 쉽게 나오지 않네요.
계속 모니터링 하고 있겠습니다.

추가- 검색하다가 SELECT MAX(make_no)+1 FROM .. WHERE .. FOR UPDATE ; 요문장을 봤습니다.

혹시 SELECT MAX(make_no)+1 FROM .. WHERE .. FOR INSERT ;는 안되는건가요? 
by 앜 [2012.01.03 14:46:52]
FOR UPDATE 를 걸더라도 다음 값을 가져 오지 않습니다..
예를들으 1번세션에서 FOR UPDATE 로 조회 하여 10 값을 가져와서 11로 만들고 INSERT 하더라도
INSERT 전에 2번세션에서 SELECT 하게 되면 FOR UPDATE 때문에 ROW LOCK 대기를 하게 되나 1번 세션에서 COMMIT 하고 LOCK 풀리고 가져오는값은 기대하는 11 값이 아니라 위 세션과 동일한 10 값을 가져 오게 됩니다.

by 앜 [2012.01.03 15:13:57]
일반적으로 쓰는 방법인지는 모르겠으나 방법은 있으나 트랜젝션이 그렇게 발생하는 시스템에 적용하기에는 위험부담이 있어 알려드릴수가 없네요...

시퀀스 사용에 대한 정당성을 협의 하시는게...

by 강민철 [2012.01.03 15:25:54]
헙..RowRock이 걸린다는 말씀은 한로우만 변경불가하게 락 걸린다는 말씀같네요. 흠...해결방안을 테이블을 하나만들어서 seq의 최종값max값을 유지할수 있도록 하기로 하였습니다. ^^ 설명감사합니다. 좀더 공부해야겠네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입