락이란? 

락(LOCK)이란 파일이나 레코드를 누군가가 열어서 작업하고 있는 도중에 다른 사용자가 이를 열지 못하도록 하고 먼저 오픈한 사용자가 닫기전까지 사용할 수 없도록 하는 것을 말한다.

 

커밋되지 않은 읽기(Dirty Read)

Dirty Page란 커밋되지 않은 즉, 트랜잭션이 완료되지 않은 페이지를 말한다.

이 더티 페이지에서 값을 읽어오는 것으로서 트랜잭션이 완료되지 않은 상태에서 데이터를 읽어오기 때문에 엉터리 값을 읽어올 가능성이 있다.

 

반복하지 않는 읽기(Non-Repeatable Read)

동일한 데이터를 반복해서 읽어왔을 때 처음 읽어왔던 데이터와 다른 경우가 발생할 수 있는데, 이를 반복하지 않은 읽기라고 한다.

커밋되지 않은 읽기와 마찬가지로 일관성 없는 데이터 읽기라고도 볼 수 있겠지만 반복하지 않은 읽기의 경우 해당 트랜잭션이 완료된 이후의 데이터를 읽는 것이기 때문에 특별한 문제라고 볼 수는 없다.

 

팬텀 읽기(Phantom Read)

팬텀(Phantom)이란 유령을 뜻하는 단어로 팬텀값이라는 것은 마치 유령처럼 값이 나타났다가 사라지는 형태의 것을 말한다.

행 범위의 한 행에 대해 트랜잭션이 삭제 혹은 추가시에 생겨나는 것으로 처음에는 데이터값을 읽어왔다가 다음에는 사라지는 경우나 그 반대의 경우를 말한다.

 

손실 업데이트

서로 다른 둘 이상의 트랜잭션들이 같은 데이터를 동시에 업데이트하는 경우에 데이터 손실이 일어날 수 있다.

이 경우 해결체은 어느 트랜잭션이 업데이트를 하고 있는 경우에 다른 트랜잭션들은 대기중으로 작업을 지연시키는 것이다.

 

 락킹 모드 

리소스 잠금 모드는 동시에 트랜잭션이 동일한 데이터베이스 리소스에 액세스할 때 어떻게 동작할 것이냐를 기준하는 것인데 트랜잭션 내에서 데이터를 처리하는 방식에 따라 크게 공유 락(Shared Lock)과 배타적 락(Exclusive Lock)으로 나뉜다.

 

공유 락은 데이터에 대한 읽기 작업을 수행하는 SELECT문에서, 배타적 락은 데이터에 대한 쓰기 및 변경작업을 수행하는 INSERT, UPDATE, DELETE문에서 수행된다.

데이터에 대한 변경작업이 수행되는 도중에 데이터 값을 읽게 되면 동시성 문제가 발생할 수 있기 때문에 배타적 락 모드로 트랜잭션이 실행되는 것이고, 데이터에 대한 읽기 작업은 다른 트랜잭션과 공유하여 사용할 수 있기 때문에 공유 락으로 설정되는 것이다.

 

공유 락의 경우 SELECT 문이 수행 종료 되면 잠금이 해제되고, 배타적 락의 경우는 트랜잭션이 종료되어야만 잠금 모드가 해제된다.