본문 바로가기

SQLP 자격증

SQLP - 트랜잭션(Transaction)

@markdown


# 트랜잭션(Transaction)

____

- 트랜잭션은 업무 처리를 위한 논리적인 작업 단위


## 트랜잭션의 특징


### 원자성(Atomicity)

- 트랜잭션은 더 이상 분해가 불가능한 업무의 최소단위이므로, 전부 처리되거나 아예 하나도 처리되지 않아야 함.


### 일관성(Consistency)

- 일관된 상태의 데이터베이스에서 하나의 트랜잭션을 성공적으로 완료하고 나면 그 데이터베이스는 여전히 일관된 상태여야 함.


### 격리성(Isolation)

- 실행 중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없음


### 영속성(Durability)

- 트랜잭션이 일단 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장.

<br/>


## 트랜잭션의 격리성


### 낮은 단계의 격리성 수준에서 발생할 수 있는 현상들

#### 1) Dirty Read

- 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 Read

- 변경 후 커밋되지 않은 값을 읽었는데, 데이터를 변경한 트랜잭션이 최종적으로 롤백 된다면 그 값을 읽은 트랜잭션은 비일관된 상태에 놓이게 됨


#### 2) Non-Repetable Read

- 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상


#### 3) Phantom Read

- 한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상


### 트랜잭션 격리성 수준 - ANSI/ISO SQL 표준

- 대부분의 DBMS는 Read Committed를 기본 트랜잭션 격리성 수준으로 사용

- 다중 트랜잭션 환경에서 DBMS가 제공하는 기능을 이용해 동시성을 제어하려면 트랜잭션 시작 전에 명시적으로 SET TRANSACTION 명령어를 수행하면 됨

<pre><code class="sql" style="font-size:15px">SQL Server

set transaction isolation level read serializable;


ORACLE

alter session set isolation_level = serializable;

</code></pre>


#### Read Uncommitted

- 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용


#### Read Committed

- 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써 Dirty Read를 방지해줌.

- 커밋된 데이터만 읽더라도 Non-Repeatable Read와 Phantom Read 현상을 막지는 못함.


#### Repeatable Read

- 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 줌

- 트랜잭션 격리성 수준이 Phantom Read 현상을 막지는 못함.


#### Serializable Read

- 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않음


> SQL 전문가 가이드 : 과목3. SQL 고급 활용 및 튜닝, 2장 Lock과 트랜잭션 동시성 제어 - 제2절 Lock(p.542 ~ p.546)

'SQLP 자격증' 카테고리의 다른 글

SQLP - 옵티마이저  (0) 2018.05.08
SQLP - 동시성 제어  (0) 2018.05.07
SQLP - Lock  (0) 2018.04.29
SQLP - 데이터베이스 I/O 원리  (0) 2018.04.28
SQLP - 데이터베이스 Call과 네트워크 부하  (0) 2018.03.11