[CS] DB Lock

말하는 감자·2025년 2월 14일

CS

목록 보기
30/33
post-thumbnail

락(Lock)이란?

동시에 여러 트랜잭션이 데이터베이스의 동일한 자원에 접근할 때 발생할 수 있는 충돌을 방지하기 위한 메커니즘

즉, 한 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 트랜잭션이 해당 데이터를 수정할 수 없게 막아 데이터의 무결성을 유지하는 역할을 한다.

락(Lock)이 없으면 ex)

통장 잔고가 10000원인 상황에서, 구독료가 각각 10000원인 A서비스와 B서비스가 동시에 결제를 시도하면

돈이 모자라지만, A서비스와 B서비스 모두 결제가 성공한다. (접근 당시 잔고 금액이 업데이트 되지 않았기 때문, 즉 무결성이 훼손된 상황)

Lock의 범위(Level)

1. 데이터베이스

전체 DB에 Lock을 설정. 주요 DB 업데이트에 사용된다.

2. 파일

테이블, 로우 등의 실제 데이터가 쓰여지는 물리적인 저장소에 락을 설정

3. 테이블

테이블에 Lock을 설정하고 주로 DDL 구문과 같이 전체 테이블에 영향을 주는 변경을 수행 시 유용

4. 페이지와 블록

페이지와 블록에 락을 설정

5. 컬럼

컬럼에 락을 설정하고 락 설정 및 해제에 대한 리소스가 많이 들어서 지원하는 DBMS가 많지는 않음

6. 로우

로우에 락을 설정하고 가장 일반적으로 사용하는 락. DML에 대한 Lock

Lock의 종류

1. 공유 락(Shared Lock)

데이터를 조회할 경우 사용된다.

여러 사용자가 동시에 데이터를 읽어도 데이터 읽관성에는 아무런 영향을 주지 않기 때문에, 공유락 끼리는 동시 접근이 가능하다.
즉, 한 사용자가 데이터를 조회하는 시점에 다른 사용자가 데이터를 조회하는것 까지는 가능하지만, 변경은 불가능하다.

공유락이 설정된 데이터에 베타락 사용 불가능

2. 베타 락(Exclusive Lock)

베타 락은 다른 세션이 해당 자원에 접근하는것을 막고 트랜잭션이 완료될 때까지 유지된다.
베타 락은 해제될 때까지 다른 트랜잭션은 해당 리소스에 접근할 수 없으며, 변경 및 읽기가 불가능

3. 업데이트 락(Update Lock)

UPDATE 쿼리의 WHERE 절에서 읽기 과정이 발생하고 그 후에 쓰기 과정이 발생하게 되는데 이 과정에서 데드락이 발생할 수 있는데 이를 방지하기 위해 사용하는 락

  • 예) 두 개의 세션이 동시에 UPDATE 쿼리를 던져서 서로 읽기 과정에서 공유 락을 얻고, 한 트랜잭션이 데이터 수정을 위해 베타락으로 전환하게 되면 나머지 트랜잭션은 더 이상 데이터에 대한 공유 또는 베타락을 얻을 수 없는 상태가 된다(수정 불가)

4. 내재 락(Intent Lock)

사용자가 요청한 범위에 락을 걸 수 있는지에 대한 유무를 파악하기 위해 사용하는 락

  • 예) A테이블의 로우에 대해 락이 걸려있는 경우에 다른 세션에서 A 테이블 전체에 대해 락을 걸기를 원한다면 로우에 락이 끝날 때까지 기다려야한다.
profile
주니어개발자(?)

0개의 댓글