anott 2023. 12. 10. 23:12

Lock

  • Lock 발생 예시 ⇒ UPDATE 진행 시 해당 Row Lock 발생, 인덱스 생성 시 해당 테이블 Lock 발생
  • 데이터를 보호하기 위해 Lock이 발생한다

 

Lock의 동시성 제어

  • 비관적 동시성 제어 : 사용자들이 같은 데이터를 동시에 사용할 것이라고 가정
    • 데이터 읽는 시점부터 Lock 걸고 조회/갱신 끝날 때까지 유지
SELECT NAME FROM USERS_INFO WHERE ID = 1 FOR UPDATE;
-- Lock UPDATE USERS_INFO SET NAME = '김철수' WHERE ID = 1;
  • 낙관적 동시성 제어 : 사용자들이 같은 데이터를 동시에 사용하지 않을 것이라고 가정
    • 데이터 읽을 때는 Lock 설정 안 한다
    • 수정할 때는 앞서 읽은 데이터가 변경되었는지 반드시 검사 → 동시성은 높지만 데이터 변경했는지 검사하는 귀찮은 과정 필요
  • 동시성 제어 없는 낙관적 프로그래밍

 

대기 이벤트

Idle 대기

  • 처리할 것이 없어서 쉬는 대기
    • SQL*NET message from client
      • 오라클 클라이언트 ↔ 서버 프로세스 ↔ 스토리지
      • 서버 프로세스는 오라클 클라이언트로부터 SQL문이 도착할 때까지 대기

Non-Idle 대기

  • 이유가 있어서 어쩔 수 없이 하는 대기
    • 디스크 I/O : SQL 처리 중 데이터가 필요할 때 디스크에서 블록 읽어오면서 발생
  • 불필요하게 SQL 기다리게 하는 대기 (이상 상태 등)

Lock에 의한 대기

  • Lock 걸려 있는 대상에 다시 Lock을 걸 때 대기 발생

 

오라클 Lock

  • Latch
    • 다중 처리를 구현하기 위한 Lock → 병렬처리를 가능하게 하고, 높은 처리량 실현
    • SGA에 공유되어 있는 자료구조(메모리) 보호할 목적의 가벼운 Lock
    • 예시) CPU 자원 부족
  • DML Table Lock
  • DML Row Lock

 

DML Table Lock

  • 현재 트랜젝션이 갱신 중인 테이블에 대한 테이블 구조 변경 방지 → DDL, DML 모두 해당
    • 오라클은 Row Lock 획득 시 Table Lock도 획득
  • Enqueue Lock
    • 공유 리소스(테이블, 트랜잭션, 테이블스페이스, 시퀀스, Temp 세그먼트 등)에 대한 액세스를 관리하는 Lock 메커니즘
    • 순서가 보장되는 Queue 구조 → 먼저 Lock을 획득한 세션이 먼저 Lock 해제
    • 테이블에 대한 Lock 획득하기 위해서는 Enqueue 리소스를 할당받아야 함
      • Enqueue 리소스는 소유자(owner), 대기자(waiter) 목록을 관리할 수 있는 구조체
  • Enqueue 매커니즘을 통해 추적할 수 있는 내역
    • Lock 대기하는 세션
    • 요청된 Lock 모드
    • 세션에서 Lock을 요청하는 순서
  • Lock이 자주 발생해도, 대부분 시간이 지나면 Enqueue 메커니즘으로 해결된다. 그렇지 않은 경우는 DBA가 해결한다

 

DML Row Lock

  • Row 단위 Lock과 트랜잭션 Lock 조합하여 구현

Row 단위 Lock

  • Lock 매커니즘은 기본적으로 Row Level Lock 모드→ 한 테이블에서 다른 행 갱신 가능
  • Undo 세그먼트에서 트랜잭션 슬롯 할당받고, Enqueue 리소스를 통해 트랜잭션 Lock을 획득한다. 그리고 INSERT, DELETE, UPDATE, MERGE 문장을 통해 갱신하는 각 Row마다 exclusive 모드로 Row 단위 Lock을 획득한다
  • Lock 매커니즘
    • 높은 레벨의 데이터 동시성
      • DML에 대한 행 레벨 Lock
      • Query에 Lock이 필요 없음 (Select로 Lock 안 함)
    • 자동 큐 관리 → Enqueue 메커니즘
      • 첫 번째로 Lock을 요청한 트랜잭션이 Lock을 획득하고, 다른 트랜잭션은 첫번째 트랜잭션이 종료될 때까지 대기
    • 트랜잭션이 종료될 때까지 Lock 보유
      • 커밋/롤백 완료 시 자동 Lock 해제

TX Lock (트랜잭션 Lock)

  • 트랜잭션 통해서 개발 데이터 행, 다중 행, 전체 테이블까지 Lock 가능
  • 인덱스 Lock도 TX Lock의 예시
  • 트랜잭션 : 하나의 작업처럼 전부 처리되거나 아예 안되도록 하는 작업의 최소 단위 → DML
    • 원자성 : 최소단위
    • 일관성 : 실행 결과가 일관성 있는 상태
    • 격리성 : 트랜잭션 실행 중 다른 트랜잭션이 접근 불가능
    • 영속성 : 트랜잭션 한 번 성공하면 그 결과는 DB에 영구적으로 저장

 

Lock 충돌

Lock 충돌 유발 원인

  • 커밋되지 않은 변경 사항
  • 장기 실행 트랜잭션
    • 대량 갱신 등으로 인해 작업이 오래 걸릴 경우 충돌 발생 (Commit 하지 않고 오랜 시간이 발생할 경우)
  • 필요 이상으로 높은 Lock 레벨
    • 오라클 1988 Release 6 버전부터 Row Level Lock 기능 추가했으며, 이전 버전은 행 레벨 Lock 불가능

Lock 충돌 해결

  • Lock을 보유하는 세션을 커밋 또는 롤백
    • Lock 충돌 해결 위해서는 Lock 보유하는 세션에서 Lock을 해제해야 한다
    • 커밋 또는 롤백으로 트랜잭션을 완료하기
  • Lock을 보유하는 세션을 종료 → 세션 Kill
    • 현재 트랜잭션 내 모든 작업이 롤백된다. 세션이 종료된 유저는 다시 로그인하여 세션의 마지막 커밋이 종료된 이후 모든 작업을 리두해야 한다
      • REDO : 커밋 이후 작업을 가져오기

 

 

출처 : http://www.gurubee.net/lecture/3130 ,https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=53046 , https://www.youtube.com/watch?v=w6sFR3ZM64c