외부시스템을 통해 데이터를 서로 주고 받고 있습니다.
외부에서 넘어온 데이터는 A테이블에 정상적으로 업데이트 되고 있는 상황입니다.
A테이블의 데이터를 다시 다른 B테이블에 update를 수행하고 있는데요.
이부분을 JOB 스케쥴을 통해 매 20분마다 설정을 해놓았습니다.
문제점)
JOB스케쥴에서 오류가 나거나 하는 사항은 없는데, 데이터가 일치하지 않는 경우가 아주 간혹(한달에 1~2건정도 )발생합니다.
즉, A테이블에서 B테이블로 업데이트시 A테이블내용은 정상인데, B테이블의 일부 컬럼값이 잘못 들어온 경우입니다.
물론 아주 여러가지 변수사항이 고려될수 있는 부분인데요...
고수분들께 여쭤볼게 있습니다.
위 내용을 요약하자면.....
1) 외부시스템db------> A테이블-UPDATE 수행(정상값)
2) A테이블 ------> B테이블-UPDATE 수행 <-( 요부분을 20분단위 job 스케쥴러등록)
* 업데이트 되는 데이터양은 많지는 않습니다.
----------------------------------------------------------------------------------------------------
테이블이 업데이트 수행중 내부적으로 락이 걸리는걸로 알고 있습니다.
물론 트랜잭션 진행중(아직 커밋되지 않은 상태)일때도 교착상태등등이 발생하여 조회중(SELECT) 지연시간이 발생할수 있다고 생각합니다.
문제는 20분단위 실행되는 수행문(쿼리문)에서 with nolock 힌트를 주고 있습니다. (다른분이 설계하고 프로그램 한 내용입니다만...)
제 생각에는 위 요약내용이 1번수행 -> 2번수행 이런식으로 시간차를 두고 순차적으로 실행된다면 문제가 없을텐데
리얼타임으로 처리가 되다보니 업데이트 처리되는 양이 적다고 하더라도 1번 수행중 2번의 job스켈쥴러가 20분마다 수행될때
1, 2번이 아주 간혹 겹치다보니 업데이트가 정상적으로 발생하지 않아서 데이터가 틀리지 않나 생각해봅니다.
별거 아닌데 글로 풀어 설명할려니 어렵네요..ㅠ...어렵게 설명드린점 이해하시고 위 상황은
아무리 생각해도 이부분 때문일거라는 생각이드네요.. 리얼타임이다 보니 어떻게 테스트할수 있는게 거의 어려운 상황입니다.
제 판단이 맞다면 조회문,업데이트문(selelct, update)시 nolock 힌트를 빼게 된다면 데이터양이 적더라도 락발생이나 교착상태등의
증상으로 인한 성능저하에 영향이 어느정도 일어날까요?
혹시 제가 판단한게 아닌 다른문제 인지도 여쭤보고 싶습니다.
고수님들 의견좀 듣고 싶습니다.
Comment 1
-
건우아빠
2015.02.08 15:35
a 테이블에 업데이트 시간을 기록하게 하신다음
20분 단위로 작업 하실때 지금 시간 보다 1초 늦은 것만 업데이트 하시면 어떠실지..
업데이트가 많지 않다면 트리거로 처리하셔도 되지 않을까요.....