# 데이터베이스에서 락(Lock)에 대해 설명해 주세요.

* 데이터베이스는 데이터를 영속적으로 저장하고 있는 시스템으로, 이런 시스템은 같은 자원(데이터)에 대해서 동시에 접근하는 경우가 생길 수밖에 없다.
* 이럴 경우 데이터가 오염될 수 있는데 그렇게 되지 않도록 데이터의 일관성과 무결성을 유지해야할 필요가 있다.
* **Lock**이란 [트랜잭션](https://github.com/genesis12345678/TIL/blob/main/interview/database/1_10/Transaction.md) 처리의 **순차성을 보장하기 위한 방법이다.**

## Lock의 종류

### 공유락(Shared Lock)

* **Read Lock**이라고도 한다.
* **데이터를 읽을 때** 사용되는 Lock으로, 이런 공유 락은 공유 락끼리는 동시에 접근이 가능하다.
* 즉, 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있는 것이다.
* 하지만 공유 락이 설정된 데이터에 베타 락을 사용할 수는 없다.

### 베타락(Exclusive Lock)

* **Write Lock**이라고도 한다.
* **데이터를 변경하고자 할 때** 사용되는 Lock으로, 트랜잭션이 완료될 때까지 유지된다.
* 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없다.
* 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없다.

## Lock 설정 범위

### 데이터베이스

* 1개의 세션만이 DB의 데이터에 접근이 가능하다.
* 일반적으로 잘 사용하지 않는다.

### 파일

* 파일(테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소)을 기준으로 Lock을 설정한다.
* 잘 사용하지 않는다.

### 테이블

* 테이블을 기준으로 Lock을 설정하며, 테이블의 모든 행을 업데이트 하는 등의 전체 테이블의 영향을 주는 변경을 수행할 때 유용하다.
* **DDL(`CREATE`, `ALTER`, `DROP` 등)** 구문과 함께 사용되고, **DDL Lock**이라고도 한다.

### 페이지와 블록

* 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정한다.
* 잘 사용하지 않는다.

### 컬럼

* 컬럼을 기준으로 Lock을 설정한다.
* Lock 설정 및 해제 리소스가 많이 들어 잘 사용하지 않는다.

### 행

* 행(row)을 기준으로 Lock을 설정한다.
* **DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock이다.**

<br>

### 참고

* [참고 블로그](https://sabarada.tistory.com/121)
