음.. 회사에서 LMS 솔루션 프로젝트를 진행중입니다.
헌데 운영서버에서 테이블 락이 걸려버려서 오류가 발생해 재기동으로 1차적으로 해결하긴 했습니다. 찾아보니 락 관련 문제는 대부분 로직이 잘못됐다는 의견이 많아서
제가 처음부터 시작한 프로젝트가 아니라 구조는 다 파악을 못 했습니다.
앞으로도 이런 오류가 발생할 확률이 매우 크다고 판단 해 오류를 좀 살펴봤는데, 확실치는 않지만 데이터를 INSERT 할 때
1. courseBean.courseApply(dto);
2. courseBean.courseApplyLect(dto);
3. courseBean.courseApplyTsk(dto);
4. courseBean.courseApplyTst(dto);
이런식으로 4번 데이터를 저장하는데 이 부분에서 데이터를 저장할 때 A 쓰레드가 1번 쿼리를 실행하고 있는데, B 쓰레드가 A 쓰레드가 아직 작업이 안 끝났는데도 불구하고,
같은 테이블에 저장을 하려 해서 락이 걸려버린것 같습니다.
여기서 질문이 예를들어
A. 사용자가 버튼을 클릭했는데 개인의 네트워크적인 문제로 로딩이 길어져서 버튼을 계속해서 눌렀을 경우 락이 발생할 수 있는지
B. 데이터를 저장 할 때 INSERT INTO ( ~ ) VALUE( SELECT ~) 이런식으로 INSERT 구문 VALUE 값에서 바로 SELECT해와서 데이터를 저장하는데
이 경우 SELECT 를 먼저 해오고 그 다음에 INSERT를 해서 순차적으로 진행하여 오류를 잡아내는게 나을까요
C. 다른 프로젝트에서는 같은 구조지만 이런 오류는 발생한 적이 없습니다. 유독 이 프로젝트에서만 락이 발생되는데 단순 네트워크 문제인지 궁금합니다.
추가로 디비가 설치되어 있는 서버와 웹서버가 다른 서버입니다. 이것도 문제가 될까요?
lock을 유발하는 쿼리가 있고 더이상 성능 개선이 어렵다면 lock timeout을 늘리는 것도 방법일 듯 합니다.
insert 문제면 시퀀스 ..
update 문제면 select for update