> For the complete documentation index, see [llms.txt](https://develop-footprint.gitbook.io/o/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://develop-footprint.gitbook.io/o/cs/database/undefined.md).

# 트랜잭션

## 트랜잭션

### 동시성 문제

* Dirty Read
  * 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 때 발생하는 문제
  * 트랜잭션 A가 트랜잭션 B에서 수정중이지만 커밋되지 않은 데이터를 읽을 수 있다. 트랜잭션 B에서 롤백 등의 이유로 커밋되지 않으면, 트랜잭션 A는 존재하지 않는 데이터를 사용하게 된다.
* Non Repeatable Read
  * 트랜잭션이 동일한 행을 두 번 읽었지만 매번 다른 데이터를 가져오는 문제
  * 트랜잭션 1이 행을 읽는다고 가정하고, 트랜잭션 2는 해당 행을 업데이트하거나 삭제하고 업데이트 또는 삭제를 커밋한다. 트랜잭션 1이 행을 다시 읽으면 다른 행 값이 검색되거나 행이 삭제되는 경우가 발생한다.
* Phantom Read
  * 트랜잭션이 조건을 사용해 특정 범위의 레코드를 두번 읽었지만 매번 다른 데이터를 가져오는 문제
  * 팬텀: 검색 기준과 일치하지만 처음에는 보이지 않는 행
  * 트랜잭션 1이 일부 검색 기준을 만족하는 일련의 행을 읽는다고 가정한다. 트랜잭션 2는 트랜잭션 1의 검색 기준과 일치하는 새 행(업데이트 또는 삽입을 통해)을 생성한다. 트랜잭션 1이 행을 읽는 문을 다시 실행하면 다른 행 집합을 가져온다.

| Transaction Isolation Level | Dirty reads | Nonrepeatable reads | Phantoms |
| --------------------------- | ----------- | ------------------- | -------- |
| Read uncommitted            | O           | O                   | O        |
| Read committed              | X           | O                   | O        |
| Repeatable read             | X           | X                   | O        |
| Serializable                | X           | X                   | X        |

### Isolation Level

#### READ UNCOMMITTED

* 가장 낮은 고립 수준
* 트랜잭션 내의 질의들이 공유 락을 걸지 않고 데이터를 읽는다.
* 다른 트랜잭션에 의해 변경이 되었지만 커밋되지 않은 데이터를 읽는 Dirty Read가 발생할 수 있다.
* 갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유한다.

```jsx
SET TRANSACTION READ WRITE
ISOLATION LEVEL READ UNCOMMITTED;
```

#### READ COMMITTED

* 트랜잭션 내의 질의들이 읽으려는 데이터에 대해서 공유 락을 걸고, 읽기가 끝나자 마자 락 해제
* 따라서 동일한 데이터를 다시 읽기 위해 공유 락을 다시 걸고 데이터를 읽으면, 이전에 읽은 값과 다른 값을 읽는 경우가 생길 수 있음
* 갱신하려는 데이터에 대해서는 락을 걸고, 트랜잭션이 끝날 때까지 보유
* PL/SQL의 디폴트 고립 수준

#### REPEATABLE READ

* 질의에서 검색되는 데이터에 대해 공유 락을 걸고, 트랜잭션이 끝날 때까지 보유함
* 한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때, 이전에 읽은 값이 항상 동일하게 유지됨
* 갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유함

#### SERIALIZABLE

* 가장 높은 고립 수준
* 질의에서 검색되는 튜플들 뿐만 아니라 인덱스에 대해서도 공유 락을 걸고 트랜잭션이 끝날 때까지 보유함
* 범위 질의의 경우 다시 조회할 때 추가되거나 제거된 레코드로 인해 팬텀 문제 발생 -> 인덱스에 대한 락으로 해결 가능, 범위를 포함한 상위 개념까지 락을 걸면 비용이 많이 들기 때문에 인덱스 락이 좋음, Next key value locking으로 해결
* 한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때 매번 같은 값을 포함한 결과를 검색하게 됨
* 갱신하려는 데이터에 대해서는 독점 락을 걸고 트랜잭션이 끝날 때 까지 보유함
