데이터베이스 락(Lock)
DataBase는 데이터를 영속적으로 저장하고 있는 시스템이다. 이런 시스템은 같은 자원(데이터)에 대해서 동시에 접근하는 경우가 생길 수 밖에 없다. 예를 들어 수강신청 시스템에서 1명만이 정원으로 남게 되었을 때, 두 사람이 거의 동시에 버튼을 누를 수 있다. 그렇지만 성공은 1명만 되어야 한다. 이런 상황에서 DBMS(DataBase Management System)가 사용하는 공통적인 방법이 Lock이다.
데이터베이스 락(Lock)
데이터베이스는 여러 사용자들이 같은 데이터를 동시에 접근하는 상황에서, 데이터의 무결성과 일관성을 지키기 위해 락을 사용한다. 락을 통해 트랜잭션 처리의 순차성을 보장하기 위한 방법이다.
데이터베이스 락(Lock) 의 종류
- 공유락(LS, Shared Lock) Read Lock라고도 하는 공유락은 트랜잭션이 읽기를 할 때 사용하는 락이며, 데이터를 읽기만하기 때문에 같은 공유락 끼리는 동시에 접근이 가능하다.
- 베타락(LX, Exclusive Lock) Write Lock라고도 하는 베타락은 데이터를 변경할 때 사용하는 락이다. 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝나기 전까지 어떠한 접근도 허용하지 않는다.\
블로킹
Lock 간의 경합(Race Condition)이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말한다. 공유락끼리는 블로킹이 발생하지 않지만, 베타락은 블로킹을 발생시킨다
공유락끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킨다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야한다. 뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하다. 이런 경합은 성능에 좋지 않은 영향을 미치므로 경합을 최소화 할 필요가 있다.
- 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률을 올린다.
- 처음부터 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야한다.
- 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않는다.
- 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행하다.
데드락
두 트랜잭션이 각각 Lock을 설정하고, 서로의 Lock에 접근하여 값을 얻어오려고 할때 서로의 Lock으로 인해 양쪽 트랜잭션이 영원히 처리되지 않는 상태이다. 상대방 Lock이 끝나야 원하는 데이터를 가져오는데 바라보고 있는 서로의 Lock이 같은 상태가 되다보니 영원히 끝나지 않은 상황이 발생하게된다.
교착상태를 해결하기 위한 방법은 다음과 같다.
- Dead Lock이 감지되면 둘 중 하나의 트랜잭션을 강제 종료한다.
- Dead Lock 방지를 위해 접근 순서를 동일하게 하는 것이 중요하다. 접근 순서 규칙을 정할 필요해야 한다.
데이터베이스의 동시성 제어
데이터베이스의 동시성 제어란?
동시에 진행되는 여러개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어 하는 기법
방법
1. Locking : 트랜잭션이 데이터에 잠금(lock)을 설정하면 다른 트랜잭션은 해당 데이터에 대해 잠금이 해제(unlock)될 때까지 접근/수정/삭제가 불가하다.
2. Timestamp : 읽기와 쓰기연산을 먼저 들어온 트랜잭션 순서로 수행된다. 먼저 들어온 트랜잭션이 항상 더 빨리 수행됨.
3. Validation : 트랜잭션 수행시에 메모리상의 복사본에서 연산을 수행하고 검증 완료 시 데이터베이스에 반영