DBMS의 Lock이란?
DBMS lock은 데이터베이스 내에서 여러 트랜잭션이 동시에 데이터에 접근하려는 경우 발생하는 데이터 불일치 문제를 해결하기 위해 사용되는 동시성 제어 메커니즘입니다. DBMS에서는 다양한 종류의 락(lock)을 제공하여 트랜잭션 간의 충돌을 방지하고 데이터 일관성을 유지한다.
예를 들어 학교에서 학생들을 관리하기 위한 프로그램이 있다고 가정할 때 아래와 같은 기능이 있을 것이다.
A 기능 : 다수의 학생 정보(이름, 주소, 성별 등)를 검색하는 기능
B 기능 : 학생 상세 정보(이름, 주소, 성별, 성적 등)를 검색하는 기능C 기능 : 학생의 주소를 변경하는 기능
학생 테이블이 있다고 가정하면, A/B/C 각 기능에서 '학생' 테이블에 DML(select, update 등)을 날려야 할 것이다.
DML을 실행할 때마다 다양한 DB 트랜잭션이 발생하게 되는데....
이러한 다양한 트랜잭션에 대해 충돌을 방지하고 데이터의 일관성을 유지하는 역할을 DB Lock기능이 해준다.
먼저 기본적으로 2가지 락 종류를 알아보면
- 공유 락 (Shared Lock)
- 읽기 락 (Read Lock) 이라고도 불린다.
- 한 트랜잭션이 데이터를 읽고 있으면 다른 트랜잭션은 해당 데이터를 읽기만 할 수 있고 수정은 할 수 없습니다.
- A가 '철수'라는 학생 데이터를 select 하는 도중에 B / C에서 '철수' 데이터에 접근하게 된다면 B에서는 읽기 기능이기 때문에 Lock이 걸리지 않지만, C는 수정을 하기 때문에 Lock이 걸려 수행되지 않을 것이다.
- 상식적으로 생각해서 내가 책을 읽고 있는데 누군가가 같이 읽는것은 괜찮지만, 책 내용을 계속 바꾼다면.... 책을 읽지 못하지 않을까?
- 배타적 락 (Exclusive Lock)
- 쓰기 락으로도 불립니다.
- 한 트랜잭션이 데이터를 수정하고 있으면 다른 트랜잭션은 해당 데이터를 읽거나 수정할 수 없습니다.
- 공유 락에서 생각해본것 처럼 이것도 같은 맥락에서 생각해보면, 내가 책의 내용을 수정하고 있는데 다른 사람도 동시에 그 부분을 수정한다면... 내가 수정한것이 최종본인지.. 다른 사람이 수정한 것이 최종본인지 애매한 상황이 발생할 것이다. 그러므로 배타적 락이 이런 부분을 방지하게 도와준다.
당연히 DBMS에서는 위 2가지 외의 다양한 Lock 종류를 제공하며, 이를 적절히 사용하여 동시성 문제를 해결한다.
최근 회사 프로젝트에서 서로 다른 쓰레드에서 같은 스키마 데이터를 수정하는 문제가 발생해서 골치가 아프다....
하나의 서비스라면 큐 줄세우기로 가능하겠지만... 아예 다른 프로세스라 어떻게 해야할지 고민이 된다...