Lock이란?
- 데이터 일관성을 위한 방법(이름 그대로 lock, 잠금)
- 유형
1. Shared Lock : 다른 사용자가 읽는 것은 허용하지만 변경하는 것은 허용하지 않는다.
2. Exclusive Lock : 다른 사용자가 읽고, 변경하는 모든 것을 허용하지 않는다. (Insert, Delete, Update)
Lock 단위
- RID - 하나의 행
- KEY - 인덱스가 있을 때 행
- PAGE - 8KB 데이터 페이지 또는 인덱스 페이지
- EXTENT - 인접한 8개의 데이터 페이지 또는 인덱스
- TABLE - 데이터와 인덱스가 포함된 전체 테이블
- 데이터와 인덱스가 포함된 전체 테이블
- DB - 데이터베이스
Lock의 종류
-
SHARED
-
트랙잭션이 데이터를 읽기 동안에만 잠금
-
공유 잠금을 사용시 여러 트랜잭션이 동시에 하나의 개체를 읽을 수 있다. (현재 운영, 개발서버)
-
공유 잠금을 사용시 다른 트랜잭션이 데이터를 변경할 수 없다.
-
다음 행을 읽을 때 현재 행의 공유 잠금을 해제한다.
-
예외 사항
- 트랜잭션 고립수준이 REPEATABLE 이상
- LOCK HITN로 해당 공유잠금을 끝까지 유지
- SELECT * FROM EMP(HOLDLOCK)
-
EXCLUSIVE(X)
- 트랜잭션이 데이터를 변경할 때 단독 잠금
- 단독잠금이 걸린 데이터는 다른 트랜잭션이 공유 잠금, 단독 잠금 또한 걸 수 없다.
- 오직 하나의 트랜잭션만이 데이터에 대한 잠금을 걸 수 있다.
- 예외사항
- 트랜잭션 격리 수준사용해서 단독 잠금 걸린 데이터를 다른 트랜잭션이 읽게 할 수 있다.
-
UPDATE(U)
- 트랜잭션이 변경할 데이터를 찾으면 거는 락
- 나중에 데이터를 변경할 때 까지 데이터가 변경되지 않음을 확실하기 위해 건다.
- 한번에 한 트랜잭션에만 업데이트 잠금을 얻을 수 있기 때문에 교착상태가 방지된다.
- U잠금이 걸린 데이터에는 다른 트랜잭션이 U잠금을 걸 수 없지만, S 잠금은 걸 수 있다.
-
INTENT(I)
- 트랜잭션이 대상 데이터에 잠금을 걸 수 있을지 없을지를 신속히 판단할 수 있게 도와주는 잠금
BLOCKING
- 블로킹은 Lock들의 경합으로 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 의미
해결하는 방법은 Transaction COMMIT, ROLLBACK
-> 결국 BLOCKING은 쿼리 하나하나가 길어질 경우에 일어날 확률이 높아지기에 SQL이 빠르게 실행되도록 리팩토링 하는 것이 효과적이다. = 트랜잭션을 짧게!, 동일한 데이터에 작업이 일어나지 않도록! 만약 일어난다면 lock_timeout을 설정하여 Lock의 최대 시간을 설정할 수 있음..
Dead Lock이란?
데드락은 트랜잭션간 교착상태를 의미하며 두 개의 트랜잭션간에 각각의 트랜잭션이 가지고 있는 리소스의 Lock을 획득하려할때 발생


대표적으로 두개의 예시가 있을 수 있음.

- 최근에 프로시져(함수화)로 인해 길어진 것이 일수도