테마
화요일 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건 들어온다DDL_LOCK_TIMEOUT 기본값은 0이다-- 14:05 패치 (처음에는 ORA-00054 가 바로 나서 첫 줄을 붙였다)
ALTER SESSION SET DDL_LOCK_TIMEOUT = 600;
ALTER TABLE T_ORD ADD (ORD_MEMO VARCHAR2(200));
[시간표 — 화요일]
시각 고객센터 상담원 (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
V$LOCK을 근거로, 상담원 한 명과 부딪칠 일이 없는 주문 등록까지 왜 3분 넘게 기다렸는지 설명하시오.