안녕하세요.
저는 개발자입니다.
현재 사이트에서 deadlock이 너무 빈번하게 일어나서 질문을 드립니다.
아래 query는 5초에 한번씩 조회 하는 쿼리인데,
회사의 DBA분은 실제 update 대상이 얼마 없기 때문에 아래 쿼리 때문에 deadlock이 발생하는 건 아닐것이다 라고 말을 합니다.
궁금한것은 설사 from 대상이 없더라도 select가 table을 스캔하는 행위 자체도 영향이 있을거란 생각이거든요.
from절에서 대상이 되는 ordno 가 없을때는 전혀 영향이 없을 거라는 건데 그게 맞는 것일까요?
update ordmst om
set
om.pantype = 2
where
om.shopno=ifnull(NULL,1)
and om.ordno in (
select ordno from (
select
omm.OrdNo
, ifnull(json_extract(omm.RefJson, '$.pauto.pautono'), '') wai_pautono
, ifnull(json_extract(omm.RefJson, '$.pauto.presetno'), '') wai_presetno
from
ordmst omm
where
omm.shopno=ifnull(NULL,1)
and omm.RokDT > current_timestamp() - interval 1 day
and omm.PanType in (4)
and omm.jobstat = 101
) uwai
where
uwai.wai_pautono = ifnull('88' , '-99999')
and uwai.wai_presetno = ifnull('35', '-99999')
)
자주 수행되는 쿼리에 의해 deadlock이 발생하는 경우는 제가 경험한 케이스로는 대부분 테이블 full scan으로 인한 경우였습니다. 건수가 적아서 아예 의심을 안한 경우도 있었는데.. 자주 실행되다보니 그정도 시간도 문제가 되었나 보더라구요. lock timeout을 설정하거나, 인덱스를 생성해서 full scan을 회피하는 것으로 해결했습니다.
pajama님 답변 감사합니다.
full scan의 문제는 거의 대부분(개발자, dba) 알고 있는 바, 처리의 필요성을 말하기에 어렵지 않습니다.
lock timeout 설정으로 deadlock은 줄일 수 있겠지만, 결국 프로그램 error 상황이 발생시키는 일일 것 같은데 좋은 방법일까요?
가능하면, 저는 select update를 쓰고 싶지는 않은데 고민이네요.
각 트랜잭션 수행시간을 최소화 하는게 좋은데, 그렇게 하기 어려운 경우에는 lock timeout을 설정했습니다.
락은 잘 모르겠고...
일단. 쿼리가 너무 복잡하네요.
불필요한 서브쿼리 제거했습니다.
UPDATE ordmst
SET pantype = 2
WHERE shopno = IFNULL(NULL, 1)
AND RokDT > current_timestamp() - INTERVAL 1 DAY
AND PanType IN (4)
AND jobstat = 101
AND IFNULL(json_extract(RefJson, '$.pauto.pautono' ), '') = IFNULL('88', '-99999')
AND IFNULL(json_extract(RefJson, '$.pauto.presetno'), '') = IFNULL('35', '-99999')
;
마농님 답변 감사합니다.
subquery 제거만으로도 속이 후련해 진 것 같습니다.
복합적인 문제여서 적용하고 추이를 본 다음 후기 추가 하도록 하겠습니다.
pajama님, 의견 다시한번 감사드립니다.
트랜잭션 수행시간을 최소화 하는 것에 정말 공감합니다.
현재 lock timeout 무한대로 설정되어 있어서 바꾸기는 힘들 것 같습니다.