고수님들 도움이 필요합니다 commit 관련... 0 3 1,660

by 코코 [2010.02.04 15:09:12]



먼저 저희 회사는 3티어 환경입니다..
다른데에도 3티어를 사용할테니 이런한 문제가 충분히 있을거라 여겨지고
검색을 할려니 뭐라 검색할지;;
질문은 미들웨어가 동시에 서버에서 데이터를 가져왔을때 commit하는 과정인데요
정확하게 예를 들어 얘기를 하면
영수증에 번호를 찍습니다.
영수증번호라는 테이블에 날짜와 영수증타입 영수증번호라는 3개의 필드만 존재하고
항상 날자별로 최상위 영수증번호만 가지구 있습니다( + 1씩 update 를 합니다 )
그러다보니 클라이언트에서 2~3인이 동시에 수납을 했을경우..
a 클라이언트 = 최상위 영수증 번호 1000번을 갖구있고
b 클라이언트 = 최상위 영수증 번호 1000번을 갖구있고

하다보니 a가 먼저 수행이 완료된다음 영수증번호가 1001로 변환하고
b가 수행을 하다 문제가 생겨 롤백을 할려고 하다보니 이미 1001로 증가되어 롤백이 안되어
프로그램이 죽어버리는 현상인거 같습니다..
도저히 이거 말곤 다른거라고 생각이 안드네요..다른문제 일수도있겠지만..
이경우 어떻게 처리해야할까요 -0-;;
락거는것도 물론 생각햇지만..락을 걸면 다른거에서 문제가 발생하여 락을 걸순없네요..
오라클 고수님들의..힘이...ㅎㄷㄷ

by 현 [2010.02.04 16:30:15]
정말 프로그램이 죽은건가요?
그냥 응답이 없어서 죽었다고 판단 하시는거 아닌가요?

일단 상황을보니 채번테이블을 사용하시는 듯 합니다.(날짜별로 최상위 번호만 가지고 있는 테이블)
채번을 하는 방법은 약 3가지로 요약할 수 있습니다.
님의 회사처럼 채번테이블로 관리하는 방법,
데이터에 직접 max+1하는 방법,
오라클 시퀀스를 사용하는 방법.

이 세가지는 장단점이 있습니다..(검색활용)
님의 회사처럼 채번테이블을 사용했을 때 가장 문제가 되는 부분은 lock입니다.
그런데 특이하게도 님의 회사는 클라이언트가 최상위 번호를 가지고 있네요?
그렇게 되면 발생하는 문제는 dup입니다.

님께 발생한 에러가 어떤 것인지 모르겠으나,
아무 반응을 안하고 있다면 lock, 에러를 발생했다면 dup 입니다.

잘 한번 살펴보세요.

by 부쉬맨 [2010.02.04 16:35:18]
제가 3티어는 정확히 이해하지몰라서 모르지만 저의경우 설명드리자면...
만약에 프로그램 작업하고있는게있습니다.
그리고 토드등 sql편리하게 작업하는 프로그램이 있습니다.

그런데 만약에 토드에서 제가 업데이트문을 하나쳤는데 커밋을 하지않았습니다.
그리고 나서 프로그램에서 커밋을 치는 sp나 실행을 하게된다면 프로그램은
다운되어버리는거죠 . 이유는 머 아시다시피 트랜잭션을 토드에서
실행을 하였는데 끝나지않은상태에서 다시 트랜잭션을 일으킬려고하니
과부화걸리는거죠 . 제가봤을때 이러한이유인듯한데
a,b,c 일때 건건이 커밋을 쳐주시는것을 해보면서 테스트를 해보셔야될꺼같습니다.
-_-;; 허접한답변 ㅠㅠ

by 현 [2010.02.04 16:52:08]
부쉬맨님 말씀에 덧붙여서,

처음에 가장 큰 값 읽어 오실때 커밋을 하란 말씀이신듯 한데
그러다가 롤백을 해야 하는 경우가 생기게 되면 곤란하게 됩니다.
단지 조회만 할껀데 커밋을 해야 하기 때문이죠.
따라서 채번 방식의 조정이 필요합니다.
처음에 조회할때는 안보여 주다가, 아니면 지금처럼 그냥 맥스값보여주다가,
저장 시점에 맥스값을 다시 따서 저장하거나, 아니면 속편히 시퀀스 쓰거나..

무엇이든 단점은 다 있죠??
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입