job 이라는 table이 있습니다.
대략
job_id int
end_yn char(1)
이런 형태로 구성되어 있습니다.
저기에 해야될 job이 쭉 들어있고,
여러 클라이언트에서 job을 하나씩 꺼내간 다음에 작업을 하게 되어 있습니다.
예를 들어서 select job_id from job where end_yn='N' limit 0,1 과 같이 해서
job을 하나씩 꺼내가게 되어 있습니다.
꺼내가면서 바로 update job set end_yn='I' where job_id=? 과 같이
작업중임을 알릴수 있도록 end_yn 값을 I 로 바꾸고 시작합니다.
실제 작업이 종료되면 다시 Y 로 값을 바꾸고 있습니다.
아시다시피 select 하고 update 하기전에 거의 동시에 select 가 일어나게 되면
2개의 클라이언트가 같은 값을 꺼내가게 됩니다.
이 문제를 해결하고 싶은데요.
현재 job 데이터는 약 10만건 정도 있고,
클라이언트가 20개 정도 있습니다
이 경우 대략적으로 100건중에서 3-4건 정도 중복이 발생합니다.
lock 을 걸게 되면 중복은 발생하지 않더라도 혹시 속도 저하가 발생하지 않을까 우려가 되고, 최악의 경우 lock이 걸린채로 무한대기 상태가
되지 않을까도 좀 걱정스럽습니다.
사실 같은 job을 조회한다고 하더라도 심각한 문제가 있는건 아닙니다.
단지 중복으로 작업을 하기 떄문에 퍼포먼스가 떨어지는거구요.
전체적인 속도에 영향을 미치지 않고 좀더 좋은 방법이 있을지 문의 드립니다.
|