DB Lock
DB Lock 이란
데이터베이스에서 여러 사용자들이 같은 데이터를 동시에 접근하는 동시성을 제어하여 데이터의 무결성과 일관성을 지키기 위한 방법이다.
Lock의 종류
Shared Lock(공유 Lock 또는 Read Lock)
보통 데이터를 읽을 때 사용한다. 원하는 데이터에 lock을 걸었지만 다른 세션에서 읽을 수 있다. 공유 Lock을 설정한 경우 추가로 공유 Lock을 설정할 수 있지만, 배타적 Lock은 설정할 수 없다. 즉, 내가 보고 있는 데이터는 다른 사용자가 볼 수 있지만, 변경할 수는 없다.
Exclusive Lock(배타적 Lock 또는 Write lock)
보통 데이터를 변경할 때 사용한다. 이름처럼 해당 Lock이 해제되기 전까지는 다른 공유 Lock, 배타적 Lock을 설정할 수 없다. 즉, 읽기 기와 쓰기가 불가능하다.
Lock의 설정 범위
데이터베이스
- 전체 데이터베이스를 기준으로 Lock을 설정한다.
- 1개의 세션만이 DB의 데이터에 접근이 가능하며 일반적으로 잘 사용하지 않는다.
- DB의 소프트웨어 버전을 업그레이드하거나 DB 업데이트를 진행할 경우 사용
파일
- 데이터베이스 파일을 기준으로 Lock을 설정한다.
- (파일이란 테이블, row등과 같은 실제 데이터가 쓰여지는 물리적인 저장 공간)
- 잘 사용되지 않는다.
테이블
- 테이블을 기준으로 Lock을 설정한다.
- 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용하다.
- DDL(CREATE, ALTER, DROP 등) 구문과 함께 사용되며 DDL Lock이라고도 부른다.
컬럼
- 컬럼을 기준으로 Lock을 설정한다.
- 하지만 Lock 설정 및 해제의 리소스가 많이 들기 때문에 잘 사용하지 않고, 지원하는 DBMS도 많지 않다.
행
- 1개의 행을 기준으로 Lock을 설정한다.
- DML에 대한 Lock으로 가장 기본으로 사용하는 Lock이다.
블로킹(Blocking)
Lock 간의 경합(Race Condition)이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말한다. 공유 락 끼리는 블로킹이 발생하지 않지만, 베타락은 블로킹을 발생시킨다.
경쟁 상태(Race Condition)이란 두 개 이상의 서로 다른 프로세스(혹은 스레드)들이 하나의 자원(리소스)에 접근하기 위해 경쟁하는 상태를 말한다.
블로킹을 해소하기 위해서는 이전 트랙잭션이 완료(commit or rollback) 되어야 한다.
뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하다.
성능에 좋지 않은 영향을 미치기 때문에 경합을 최소화해야 한다.
그러므로 트랜잭션 처리 시간을 짧게 가져가는 것이 좋다.
교착상태(DeadLock)
교착상태는 두 트랜잭션이 각각 Lock을 설정하고 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태를 의미한다.
해결 방법
- Dead Lock이 감지되면 둘 중 하나의 트랜잭션을 강제 종료한다
- Dead Lock 방지를 위해 접근 순서 규칙을 정해 접근 순서를 동일하게 한다.
Reference
https://hstory0208.tistory.com/entry/%EB%9D%BDLock%EC%9D%B4%EB%9E%80-Lock%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9CDeadLock