Skip to content
튜닝 연습Lock과 동시성 제어
LOCK-040

컬럼 하나 더하는 패치를 돌린 3분 남짓 동안 쇼핑몰 주문 화면이 전부 멈췄다

기초DDL한빛유통535 / 700

상황 ​

화요일 14:05, 개발팀이 「주문 메모」 기능을 위해 T_ORD에 컬럼 하나를 더하는 패치를 SQL*Plus로 돌렸다. 처음에는 ORA-00054: resource busy and acquire with NOWAIT specified가 바로 떴다. 담당자는 검색해 본 대로 DDL_LOCK_TIMEOUT을 600초로 주고 다시 돌렸다. 그 뒤 14:05:02부터 14:08:31까지 쇼핑몰의 주문 등록과 결제 완료가 전부 멈췄다. 패치는 14:08:31에 "Table altered."를 찍고 끝났다. 담당자는 이렇게 말한다. "컬럼 추가는 0.01초짜리인데요?"

테이블과 인덱스 ​

  • T_ORD 주문: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ) · 낮에는 주문 등록(INSERT)이 초당 5 ~ 10건, 결제 완료 콜백(UPDATE)이 초당 3 ~ 6건 들어온다
  • 고객센터 「주문 수정」 화면은 상담원이 결제 수단을 바꾸면 그 주문 행을 UPDATE하고, 「저장」을 누를 때 COMMIT한다
  • 쇼핑몰 WAS의 커넥션 풀은 120개다
  • 이 DB의 DDL_LOCK_TIMEOUT 기본값은 0이다

원본 SQL ​

sql
-- 14:05 패치 (처음에는 ORA-00054 가 바로 나서 첫 줄을 붙였다)
ALTER SESSION SET DDL_LOCK_TIMEOUT = 600;
ALTER TABLE T_ORD ADD (ORD_MEMO VARCHAR2(200));

실행계획 학습용 예시 · 줄의 모양은 교재 12화 실측(실습/05 [D2]) ​

xplan
[시간표 — 화요일]
시각        고객센터 상담원 (SID 77)            패치 (SID 140)                          주문 등록 · 결제 완료 (WAS 세션들)
14:03:12    주문 81,207 결제 수단 변경 UPDATE
            (통화 중 · COMMIT 전)
14:05:00                                        ALTER TABLE → ORA-00054 (0초)
14:05:02                                        DDL_LOCK_TIMEOUT 600 · ALTER TABLE → 기다림
14:05:03 ~                                                                                INSERT · UPDATE T_ORD → 하나씩 기다림
14:08:31    「저장」 → COMMIT                    → Table altered. (0.01초)               → 한꺼번에 진행 (기다린 세션 최대 97개)

[V$SESSION — 14:07:00]
SID      EVENT                            SECS      BLOCKING_SESSION   하고 있는 문장
77       SQL*Net message from client       228                         (통화 중 · 트랜잭션을 연 채)
140      enq: TM - contention              118      77                 ALTER TABLE T_ORD ADD (ORD_MEMO VARCHAR2(200))
(91개)   enq: TM - contention          1 ~ 117      140                INSERT INTO T_ORD … / UPDATE T_ORD SET ORD_ST = 'COMPLETE' …

[V$LOCK — 같은 시각 · TM 은 객체 이름으로]
SID   TYPE  대상                LMODE  REQUEST  BLOCK
77    TM    T_ORD                 3       0       1
77    TX    77 의 트랜잭션         6       0       0
140   TM    T_ORD                 0       6       0      ← 쥔 것은 없다 · 그런데 뒤의 세션들은 V$SESSION 에서 140 을 가리킨다
212   TM    T_ORD                 0       3       0      ← 주문 등록 하나 (나머지 90개도 같은 모양)

[같은 패치를 03:00 에 연습 DB 복사본에서 다시 잼]
  ALTER TABLE T_ORD ADD (ORD_MEMO VARCHAR2(200))   0.01초 · 기다림 0

문제 ​

  1. 시간표와 V$LOCK을 근거로, 상담원 한 명과 부딪칠 일이 없는 주문 등록까지 왜 3분 넘게 기다렸는지 설명하시오.
  2. 같은 컬럼을 더하는 패치를 다시 쓰고, 언제 어떻게 돌릴지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자