카테고리 없음
Lock
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문이 도착할 때까지 대기
- SQL*NET message from client
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