#데이터 변경 관리 락

데이터 변경 관리 락의 개념

데이터 변경 관리 락은

DML 수행 등으로 데이터에 변화가 발생할 때 적용, 롤백과 커밋 수행시 해제, 엔큐 메커니즘 이용하여 데이터 동시성 제어

구분정보사원 정보 업데이트 예
{code:noneborderStyle=solid}테이블 락™{code}세그먼트 단위로 락이 적용사원 테이블에 행 배타적(TM-RX) 모드 적용
{code:noneborderStyle=solid}행 락(TX){code}행 단위로 락이 적용, 트랜잭션 락사원 테이블의 사번 1113 레코드에 배타적(TX-X) 모드 적용

테이블 락 (V$LOCK.TYPE = 'TM')

LMOD이름설명SQL
1NULL널락
  • SELECT
2RS행 공유 락
  • LOCK ROW SHARE
  • LOCK SHARE UPDATE
  • 부모/자식 키 설정에 따라 DML 수행 시 적용
3RX행 배타적 락
  • DML(INSERT, UPDATE, DELETE)
  • SELECT FOR UPDATE
  • LOCK ROW EXCLUSIVE
4S공유 락
  • LOCK TABLE SHARE
  • CREATE INDEX
  • 부모/자식 키 설정에 따라 DML 수행 시 적용
5SRX공유 행 배타적 락
  • LOCK SHARE ROW EXCLUSIVE
6X배타적 락
  • LOCK EXCLUSIVE
  • ALTER
  • DROP
  • 병렬 DML (PARALLEL 힌트)
  • DIRECT INSERT (APPEND 힌트)

LOCK 명령

SQL> LOCK TABLE :TABLE_NAME IN :LOCK_MODE MODE [NOWAIT]
항목설명
:TABLE_NAME락을 명시적으로 적용하고자 하는 테이블 이름
:LOCK_MODE적용 하고자 하는 락 모드
- ROW SHARE(RS)
- ROW EXCLUSIVE(RX)
- SHARE(S)
- SHARE ROW EXCLUSIVE(SRX)
- EXCLUSIVE(X)
NOWAIT대기 불가능 모드로 락 적용
SQL> LOCK TABLE 사원 IN EXCLUSIVE MODE
-- 사원 테이블에 배타적 락 적용

PK ~ FK 설정 상황의 테이블 락

상황 설정

  • 부서(테이블).부서코드(컬럼) : PK┐
  • 사원(테이블).부서코드(컬럼) : FK┘
§사원 테이블에 INSERT, DELETE, UPDATE(FK 컬럼) : UPDATE 사원 SET 부서코드 = 'C' WHERE 사번 = 1000
테이블테이블 락 요청모드테이블 락 지속기간행 락 요청모드행 락 지속기간
사원TM-RX트랜잭션TX-X트랜잭션
부서TM-RS트랜잭션TX-SDML 수행시

※ DML 수행 되는 사원 테이블 뿐 아니라, 부서 테이블에도 테이블/행 락 발생 (PK 테이블의 구조와 데이터가 변경되는 것을 막음)
※ 부서 테이블의 행 락(TX-S)은 DML 수행 후 바로 할당 해제, 여러 건 이라면 한 건씩 TX-S 락 적용/적용 해제

§부서 테이블에 DELETE, UPDATE(PK 컬럼) : DELETE 부서 WHERE 부서코드 = 'A'
테이블테이블 락 요청모드테이블 락 지속기간행 락 요청모드행 락 지속기간
사원TM-SDML 수행 시
부서TM-RX트랜잭션TX-X트랜잭션

※ 부서 테이블 에서 부서코드 = 'A' 레코드를 삭제 하는 동안 사원 테이블에 해당 코드를 참조하는 데이터가 저장되면 안되므로 두 테이블 모두에 락 적용
※ 9i 이전에는 PK 테이블에 DML 발생 시 트랜잭션 완료 시점 까지 FK 테이블에 TM-S 락 적용 (FK 테이블 데이터 변경 못하게 되므로 문제가 있음)

§부서 테이블에 INSERT
테이블테이블 락 요청모드테이블 락 지속기간행 락 요청모드행 락 지속기간
사원TM-RS트랜잭션
부서TM-RX트랜잭션TX-X트랜잭션

※ 기존에 없던 데이터의 생성 이므로 무결성을 보호할 필요가 없음

§부서 테이블에 DELETE CASCADE
테이블테이블 락 요청모드테이블 락 지속기간행 락 요청모드행 락 지속기간
사원TM-SRX → TM-RX트랜잭션TX-X트랜잭션
부서TM-RX트랜잭션TX-X트랜잭션

※ CASCADE 에 의해 DELETE 가 발생 하는 사원 테이블의 경우 락이 변경(TM-SRX → TM-RX)된다.

§부서 테이블에 DELETE, UPDATE(PK 컬럼) WITH 사원.부서코드 컬럼에 인덱스 생성: DELETE 부서 WHERE 부서코드 = 'A'
테이블테이블 락 요청모드테이블 락 지속기간행 락 요청모드행 락 지속기간
사원TM-RS트랜잭션TX-S트랜잭션
부서TM-RX트랜잭션TX-XDML 수행 시

※ FK 키 컬럼(사원.부서코드)에 인덱스가 생성된 경우 테이블에 TM-S 대신 TM-RS 락이 적용 되므로 사원 테이블에 DML 가능

락 모드간 동시 적용 가능 여부
구분 (적용된락)
(요청락)
NULLRSRXSSRXX
NULL가능가능가능가능가능가능
RS가능가능가능가능가능불가능(X)
RX가능가능가능불가능(X)불가능(X)불가능(X)
S가능가능불가능(X)가능불가능(X)불가능(X)
SRX가능가능불가능(X)불가능(X)불가능(X)불가능(X)
X가능불가능(X)불가능(X)불가능(X)불가능(X)불가능(X)
§사원 테이블에 APPEND INSERT 와 UPDATE
  • 사례
    1. 세션1) INSERT /* APPEND */ INTO 사원 SELECT * FROM 사원_OLD; (TM-X 락 획득)
    2. 세션2) UPDATE 사원 SET 이름 = '강지현' WHERE 사번= 1113; (TM-RX 락 요청 후 대기 / enq: TM - contention)
  • 테이블 락을 사용하지 않으면
    1. 테이블 엔큐 락 적용 부하가 없어지므로 성능 증가 (특히 RAC 환경)
    2. 병렬 DML 및 다이렉트 INSERT 문과 일반 DML 문을 동시 사용 가능 (행 락에 의해 정합성 유지)
  • 테이블 락을 사용하지 않으려면
    1. DML_LOCKS 파라미터를 0 으로 설정 : 인스턴스에서 사용할 수 있는 전체 테이블 락 수
    2. ALTER TABLE DISABLE(ENABLE) TABLE LOCK
  • 테이블 락을 사용하지 않는 경우 제약사항
    1. ALTER TABLE 명령 사용 불가
    2. DROP TABLE/INDEX 사용 불가
    3. LOCK 명령 사용 불가
    4. PK/FK 설정 시 PK 테이블의 데이터를 UPDATE/DELETE 불가

행 락 (V$LOCK.TYPE = 'TX')

행 락(트랜잭션 락)

DML 수행 시 적용, 데이터 수정 시 배타적 모드로(enq: TX - row lock contention), 참고 시 공유 모드로 적용

§행 락 적용 과정

1. DML 이 수행 되면 해당 데이터가 저장되어 있는 데이터 블록에 접근하여 ITL 획득
2. ITL 획득 뒤, ROWID 값으로 변경이 필요한 행에 접근하여 행 락 적용 여부 확인

  • 변경하고자 하는 행의 락 바이트 값 확인 (0 이면 행 락 없음, 0 이 아닌 경우에도 실제 행 락이 적용 되어 있는지 확인 필요)
  • ITL을 이용하여 언두 세그먼트 헤더의 트랜잭션 테이블 확인
    3. 다른 트랜잭션에 의해 행 락이 적용되어 있지 않으면 락 바이트를 변경하고 TX-X 행 락 적용
    4. 리두 정보 생성
    5. 언두 정보 생성 하고 언두 세그먼트에 기록
    6. 리두 정보를 리두 로그 버퍼에 저장
    7. 행을 변경 한다
    8. 변경 완료 메세지를 출력

ITL(Interested Transaction List

오라클 블록에 저장된 행에 대한 변경 정보 및 언두 위치 정보를 저장하는 오라클 내부 아키텍처

※ ITL 은 오라클 블록에 대한 변경을 일으키려 할 때 이를 접수하는 창구의 역할을 함.

§트랜잭션 커밋 확인 방법
  • 빠른 블록 클린아웃(Fast Block Cleanout)
  • 지연된 블록 클린아웃(Deferred Block Cleanout)

데드락

데드락

서로 다른 트랜잭션이 상대방이 변경한 데이터에 대해서 교차 변경을 시도해서 발생하는 교착 상태

데드락 사례

1. 트랜잭션1) UPDATE 테이블 SET ID = B WHERE ID = A (TX-X)
2. 트랜잭션2) UPDATE 테이블 SET ID = E WHERE ID = D (TX-X)
3. 트랜잭션1) UPDATE 테이블 SET ID = F WHERE ID = D (TX-X 요청 대기[순서2])
4. 트랜잭션2) UPDATE 테이블 SET ID = G WHERE ID = A (TX-X 요청 대기[순서1])
※ 이 두 트랜잭션은 대기 상태를 풀지 못하고 계속 대기하며 이런 상태를 데드락 이라고 함, 데드락 상태로 빠진 후 60초가 지나면 먼저 대기 상태로 빠진 트랜잭션(트랜잭션1)에서 ORA-00060: deadlock detected while waiting for resource 에러 발생

enq: ... 대기 이벤트 파라미터 의미

  • P1 - 타입 + 요청모드
  • P2 - 언두 세그먼트 번호 + 트랜잭션 슬롯 번호 (V$LOCK 의 ID1 컬럼과 동일)
  • P3 - 트랜잭션 슬롯 재사용 번호 (V$LOCK 의 ID2 컬럼과 동일)