데이터베이스 락 (공유락과 베타락)

데이터베이스 락

1. 공유락

공유락은 데이터를 변경하지 않는 읽기 작업을 위한 락으로, 리소스를 읽을 수는 있지만 수정할 수 없게 하기 위한 락이다.

다른 트랜잭션에서 공유락이 걸린 데이터를 읽어도 데이터의 정합성은 지켜지기 때문에 다른 트랜잭션의 공유락은 막지 않는다. 하지만 공유락이 걸린 데이터에 베타락을 걸고 접근할 수는 없다. 쓰기 작업을 하게 된다면 기존 트랜잭션의 작업과 결과가 달라질 수 있기 때문에 데이터 정합성이 지켜지지 않기 때문이다.

SELECT 쿼리에서 FOR SHARE 문법을 이용해 공유락을 걸 수 있다.

SELECT * FROM tables WHERE id = 1 FOR SHARE;

2. 베타락

베타락은 데이터를 수정할 수 있도록 하되, 다른 트랜잭션이 동시에 접근하지 못하도록 하기 위한 락이다.

베타락이 걸린 데이터에는 공유락과 베타락 모두 걸고 접근할 수 없다.

한 트랜잭션에서 쓰기 작업을 할 때, 다른 트랜잭션에서 해당 데이터를 읽는다면 읽기 결과가 달라질 수 있으므로 다른 트랜잭션의 공유락 획득을 막는다.

또한 한 트랜잭션에서 쓰기 작업을 할 때, 다른 트랜잭션에서 해당 데이터에 쓰기 작업을 한다면, 기존 쓰기 작업 결과가 달라질 수 있으므로 다른 트랜잭션의 베타락 획득을 막는다.

수정 의도가 있는 SELECT 쿼리에서 사용하고자 할 때, SELECT 쿼리에서 FOR UPDATE 문법을 이용해 공유락을 걸 수 있다.

SELECT * FROM tables WHERE id = 1 FOR UPDATE;

정리

  공유락 베타락
공유락 ✅허용 ❌대기
베타락 ❌대기 ❌대기