참조
락(Lock)이란
- DB에는 동시에 많은 사용자들이 접근하게 됨
- 이러한 상황에서 데이터의 무결성과 일관성을 지기키 위해 사용됨
락(Lock)종류
- 공유 락(Shared Lock)
- 데이터를 변경하지 않는 읽기 명령에 주어지는 락
Read Lock
이라고도 불리며 앞 글자를 따서 S
로 표기
- 여러 사용자가 동시에 데이터를 읽어도 데이터의 일관성에는 영향을 주지 않기 때문에 공유 락끼리는 동시에 접근 가능
- 베타 락(Exclusive Lock)
- 데이터의 변경을 요구하는 쓰기 명령들에 대해 주어지는 락
Write Lock
으로도 불리며 X
로 표기
- 다른 자원에서 해당 자원에 접근하는 것을 막음(SELECT, INSERT 등)
- 이러한 점을 통해 멀티 쓰레드 환경에서 임계 영역을 안전하게 관리하기 위해 활용되는 뮤텍스와 유사하다고 볼 수 있음
- 베타 락은 트랜잭션 동안만 유효
- 뮤텍스(Mutex)
- 상호 배제(Mutual Exlusion)의 약자로 락(Lock)이라고도 함
- 여러 쓰레드를 실행하는 환경에서 자원에 대한 접근 제한을 위한 동기화 메커니즘
- 즉, 임계구역을 가진 쓰레드들의 실행시간을 다르게 하여 각각 단독으로 실행되도록 하는 기술
- 업데이트 락(Update Lock)
- 데이터의 수정을 위해
베타 락(X)
을 걸기 전 데드 락을 방지하기 위해 사용되는 락
- 일반적으로 업데이트 락은
UPDATE쿼리
에서 WHERE절
이 실행되는 과정에서 적용
- 서로 다른 트랜잭션에서 동일한 자원에 대해 읽기 쿼리 이후 업데이트 쿼리를 적용하는 경우
컨버젼 데드락
이 발생하는데 이를 막기 위해 일부 SELECT쿼리에도 업데이트 락을 적용하기도 함
- 내재 락(Intent Lock)
- 앞선 락들과는 다른 기능을 제공
- 사용자가 요청한 범위에 대한 락을 걸 수 있는지 여부를 빠르게 파악하기 위해 사용되는 락
- 내재 락은 공유 락과 베타 락 앞에
I
를 붙인 IS, IX, SIX
등이 있음
- 사용자A가 테이블의 로우에 대해
베타 락(X)
을 건 경우 사용자B가 테이블 전체에 대한 락을 걸기 위해서는(스키마 변경 등) 사용자 A의 트랜잭션이 끝날 때까지 기다려야함, 하지만 사용자B가 테이블에 락을 걸 수 있는지 확인을 위해 테이블의 모든 로우와 락을 확인하는 것은 비효율적
- 따라서, DB는 사용자A가 로우에
베타 락(X)
을 거는 시점에 해당 로우의 상위 객체들(페이지, 테이블)에 대한 내재 락(IX)
을 걸어 다른 사용자가 더 큰 범위의 자원들에 대해 락을 걸 수 있는지 여부를 빠르게 확인 가능
Lock Escalation
- 하나의 로구에 대해 락을 생성하는 경우 상위 객체들에 대해 내재 락들이 함께 생성
- 락은 생성할 때 많은 메모리 자원을 활용하므로 테이블내의 일정 비율 이상의 로우에 대해 락을 생성할 경우 모든 로우에 락을 적용하는 대신 더 상위 객체에 락을 걸어 메모리를 절약