#오류에 대해 지적해 주시면 수정하겠습니다.

 

트랜잭션(Transaction)

- DB의 상태를 변환시키는 논리적인 기능을 하는 작업의 단위

- 트랜잭션의 단위는 더 이상 작아질 수 없는 최소의 단위

 

 

 

 

ACID

- Atomicity 원자성트랜잭션의 연산과정 모든 것이 DB에 반영되거나, 전혀 반영되지 않아야한다. (All or Nothing)

트랜잭션의 모든 명령은 완벽히 수행되어야 하고, 만약 실패할 경우 트랜잭션 전체를 롤백 시켜야 한다.

트랜잭션의 단위보다 더 작은 명령으로 나눌수 없다는 점을 빗대어 트랜잭션의 원자성이라 표현한다!

 

- Cosistency 일관성

트랜잭션 실행이 완료되어도 일관성 있는 DB상태가 되어 있어야 한다.

시스템의 고정요소는 트랜잭션 수행 전과 수행 완료 후 상태가 같아야 한다.

ex) 계좌 이체를 빗대어 봤을 때, 계좌 이체가 성공적으로 수행한다고 계좌번호 혹은 계좌주 명이 바뀌면 안된다(명시적)

ex) 계좌 이체가 수행 되었을 때, 계좌의 합이 같아야 하는 것(비명시적)

 

- Isolation 독립성, 고립성여러 트랜잭션이 동시에 수행되더라도, 각각의 트랜잭션이 다른 트랜잭션의 영향을 받지 않고, 주지 않아야 함.만약 이 조건이 성립되지 않는다면 완벽한 롤백이 되지 않는다. 고립성을 가장 완벽하게 지키는 방법은 순차적으로 트랜잭션을 수행하는 것이다.

 

- Durability 지속성트랜잭션이 성공적으로 완료되어 커밋이 되었다면, 해당 트랜잭션에 의한 변경사항은 소프트웨어에 장애가 생기더라도 유지되어야 한다.

 

 

 

 


 

 

 

동시성과 고립성의 관계

 

트랜잭션에서 가장 대립되는 두가지 성질이다. 위에서 설명한 ACID 특성을 지켜내기 위해서, 그중에서도 고립성을 완벽하게 지키려면 모든 트랜잭션을 순차적으로 진행해야 한다.

하지만 그러한 방법은 처리 속도가 느리다는 문제성이 발생한다. 이러한 문제를 해결하기 위해 DBMS는 격리 수준을 나누어 서비스 환경에 따라 고립 수준을 부여하도록 제공하고 있다.

속도가 더 중요하다면 격리 수준을 낮추고, 데이터의 무결성이 중요하다면 격리 수준을 높이는 식으로!

 

 

 

낮은 격리 수준에서 발생하는 고립성 문제

-Dirty Read

-NonRepeatable Read

-Phantom Read

 

 

 

 

-Dirty Read

하나의 트랜잭션이 커밋 되지 않았을 때, 다른 트랜잭션이 해당 트랜잭션의 중간 값을 읽어 오는 것을 말한다.

아래의 사진을 보면 Transaction_1이 아직 Commit이 되지 않았는데

Transaction_2에서 Commit되지 않은 Transaction_1의 값을 조회해갔다.

만약, Transaction_1이 결국 Commit되지 않고 Rollback이 된다면 Transaction_2는 잘못된 값으로 로직을 수행하게 된다.

 

 

 

 

-NonRepeatable Read

한 트랜잭션 내에 같은 키를 가진 Row를 두 번 불렀는데 키의 값에 UPDATE가 수행 되어,

두 번의 Select 결과가 다른 경우이다.

아래의 그림을 보면 Transaction_2가 두번의 Select를 수행하는 도중 Transaction_1이 키의 값을 변경함으로써

Transaction_2의 트랜잭션 도중 값이 변경되어 잘못된 결과값이 나올 수 있다.

 

 

-Phantom Read

Phantom. 환영(幻影), 또는 유령 등을 뜻하는 영어

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을때, 첫 쿼리에선 나오지 않은 것이 그 다음 쿼리가 나오는 사이 커밋 되어 다른 값으로 나오는 경우이다. 

아래의 경우를 보면 Transaction_1이 먼저 Insert를 수행하고 아직 Commit되지 않은 상태에서 Transaction_2가 조회를 해서 앞에 Insert를 한 결과를 포함하지 않은 결과가 나왔고, 이어서 한 조회에서는 Commit이후이기 때문에 아까는 없었던 값이 포함된 새로운 결과가 나왔다.

 

 

(+)

NonRepeatable Read와 Phantom Read의 차이점

NonRepeatable Read는 하나의 row에서 수행되지만 Phantom Read는 여러 개의 데이터를 읽을 때 일어나는 현상이다.

Phantom Read가 일어나는 쿼리문 예시) SELECT COUNT(*) FROM ~ , SELECT * FROM ~

 

 

 

 

 

 


 

 

 

격리수준(isolation level)

- Read Uncommitted

- Read Committed (Oracle default)

- Repeatable Read (MySQL InnoDB default)

- Serializable

 

 

- Read Uncommitted

가장 하위 레벨의 격리 수준으로 트랜잭션이 commit 되지 않은 데이터를 다른 트랜잭션이 읽을 수 있도록 허용한다.

 

발생 가능한 문제 :  Dirty-Read, Non-Repeatable Read, Phantom Read

 

 

- Read Committed

트랜잭션의 커밋이 확정된 데이터만 읽을 수 있게 허용한다.

아직 커밋이 되지않은 데이터지만 Undo 로그에서 이전 데이터를 가져오는 것이 가능하기 때문에 

실제 DB데이터가 아닌 저기서 들고 온다.

Dirty-Read는 혹시 모를 롤백의 경우에만 문제를 일으키기 때문에 해결 가능하나 나머지 고립성 문제는 그대로 존재하게 된다.

 

해결 가능한 문제 : Dirty-Read

발생 가능한 문제 : Non-Repeatable Read, Phantom Read

 

 

(오른쪽)해결 가능한 문제 (왼쪽)해결 불가능한 문제

 

 

- Repeatable Read

 

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 읽을 수 있도록 허용된다. 트랜잭션 도중 다른 트랜잭션이 커밋 되어도, 새로 커밋된 데이터는 보이지 않게 된다.

 

아래의 그림을 보면 Transaction_2가 수행되는 도중 Transaction_1이 Busan의 값을 Jeju로 변경했으나 Transaction_2는 해당 Transaction_1이 커밋을 완료 했음에도 Busan으로 출력되게 된다.

이처럼 Repeatable Read 격리 수준은 수행되는 시점을 기억해서 해당 트랜잭션이 완료될 때 까지 기억된 초기 시점 이전까지 커밋된 데이터만 조회 할 수 있도록 한다.

 

 

- Serializable

가장 높은 수준의 격리 수준으로 특정 트랜잭션이 수행중엔 해당 테이블에 다른 트랜잭션이 UPDATE, DELETE, INSERT를 못하게 막는다. 동시성이 가장 낮은 격리 수준이기 때문에 거의 사용하지 않는다고 한다.

 

 

 

 

 

 

 

'Database' 카테고리의 다른 글

[SQLD][1과목]데이터 모델과 성능  (0) 2021.09.02
[SQLD]SQL 기본 및 활용(2)  (1) 2021.08.31
[SQLD]SQL 기본 및 활용(1)  (0) 2021.08.27
[SQLD]데이터 모델링의 이해  (0) 2021.08.23

+ Recent posts