select update Deadlock 0 6 2,881

by 모과나무언덕 [SQL Query] mariadb deadlock [2023.11.22 10:53:37]


안녕하세요. 
저는 개발자입니다. 
현재 사이트에서 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')
                        )

 

by pajama [2023.11.22 13:39:49]

자주 수행되는 쿼리에 의해 deadlock이 발생하는 경우는 제가 경험한 케이스로는 대부분 테이블 full scan으로 인한 경우였습니다. 건수가 적아서 아예 의심을 안한 경우도 있었는데.. 자주 실행되다보니 그정도 시간도 문제가 되었나 보더라구요. lock timeout을 설정하거나, 인덱스를 생성해서 full scan을 회피하는 것으로 해결했습니다.


by 모과나무언덕 [2023.11.22 14:51:11]

pajama님 답변 감사합니다. 

full scan의 문제는 거의 대부분(개발자, dba) 알고 있는 바, 처리의 필요성을 말하기에 어렵지 않습니다.

lock timeout 설정으로 deadlock은 줄일 수 있겠지만, 결국 프로그램 error 상황이 발생시키는 일일 것 같은데 좋은 방법일까요?

가능하면, 저는 select update를 쓰고 싶지는 않은데 고민이네요.

 


by pajama [2023.11.22 15:29:24]

각 트랜잭션 수행시간을 최소화 하는게 좋은데, 그렇게 하기 어려운 경우에는 lock timeout을 설정했습니다.


by 마농 [2023.11.22 14:58:16]

락은 잘 모르겠고...
일단. 쿼리가 너무 복잡하네요.
불필요한 서브쿼리 제거했습니다.
 

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')
;

 


by 모과나무언덕 [2023.11.22 22:15:32]

마농님 답변 감사합니다. 

subquery 제거만으로도 속이 후련해 진 것 같습니다.

복합적인 문제여서 적용하고 추이를  본 다음 후기 추가 하도록 하겠습니다.


by 모과나무언덕 [2023.11.22 22:18:59]

pajama님,  의견 다시한번  감사드립니다.

트랜잭션 수행시간을 최소화 하는 것에 정말 공감합니다. 

현재 lock timeout  무한대로 설정되어 있어서 바꾸기는 힘들 것 같습니다.

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