🗓 22-08-14
SQLP 3과목 이론 복습
SQLP 필기 풀이
[링크]([SQLP필기풀이]7장 LOCK과 트랜잭션 동시성 제어 (1) LOCK)
[SQLP필기풀이]7장 LOCK과 트랜잭션 동시성 제어 (1) LOCK
- 1 ~ 15번
SQLP 필기 풀이
👀 8/13 복기
[1] TX Lock
링크
- 트랜잭션이 첫 번째 변경을 시작할 때 얻고, 커밋 또는 롤백할 때 해제된다.
- 변경 중인 레코드(또는 기타 리소스)를 동시에 변경하려는 트랜잭션이 있으면 트랜잭션 Lock(TX Lock)을 사용하여 액세스를 직렬화한다.
오라클에서는 로우 Lock을 로우 단위 Lock과 TX Lock을 조합해서 구현한다.
- 로우를 갱신하려면 Undo 세그먼트에서 트랜젝션 슬롯을 할당받고
- Enqueue 리소스를 통해 TX Lock을 획득한다.
- ⭐️TX Lock은 트랜잭션을 시작할 때 한 번만 획득한다.⭐️
- insert, update, delete, merge 문장을 통해 갱신하는 각 로우마다 Exclusive 모드로 로우 단위 Lock을 획득한다.
[2] DML문 LOCK 호환성
- SQL Server는 SELECT 문으로 데이터를 읽을 때 공유 Lock을 사용한다. 공유 Lock끼리는 호환되므로 서로 블로킹 하지 않지만, 공유 Lock은 배타적 Lock과 호환되지 않으므로 서로 불로킹 한다.
- 테이블에 Unique 인덱스나 제약이 없으면, INSERT 끼리는 서로 블로킹 하지 않는다.
- 테이블에 Unique 인덱스나 제약이 설정돼 있으면, 같은 값을 동시에 INSERT 하지 못한다.
- 후행 트랜잭션은 기다렸다가 선행 트랜잭션이 커밋하면 Unique 제약 위반 에러가 발생하고,롤백하면 INSERT를 진행한다.
- INSERT 중인 데이터를 다른 트랜잭션이 읽거나 변경하거나 삭제하는 작업은 인덱스나 제약 유무에 상관없이 불가능하다.
- MVCC 모델을 사용하는 오라클은 SELECT문 수행 시 어떤 Lock도 사용하지 않는다.
- 따라서 DML이 수행 중인 데이터를 어떤 간섭도 받지 않고 읽을 수 있다.
- 물론, 다른 트랜잭션이 읽고 있는 데이터를 변경할 때도 블로킹은 발생하지 않는다.
[3] 오라클에서의 Serializable 격리성
- ⭐️오라클에서 SELECT 문으로 데이터를 읽을 때는 Serializable 수준에서도 Lock을 전혀 사용하지 않는다.⭐️
- ⭐️따라서 트랜잭션 격리성 수준을 상향 조정했다고 해서 Lock 경합이 증가하거나 조회 성능이 느려지지는 않는다.⭐️