GiYeong

트랜잭션 본문

CS/DB

트랜잭션

gy2710 2022. 6. 18. 02:03

트랜잭션(Transaction)은 DB의 상태를 변환시키기 위해 수행하는 작업 단위이다.

상태를 변환시킨다는 것은 SQL 질의어를 통해 DB에 접근하는 것이다.

 

특징(ACID)

1. 원자성(Atomicity)

트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.

즉, 트랜잭션 내의 모든 명령을 반드시 완벽하게 수행되어야 하며, 어느 하나라도 오류가 발생되면 트랜잭션 전부가 취소되어야 한다.

2. 일관성(Consistency)

트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.

즉, 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 후의 상태가 같아야 한다.

3. 독립성(Isolation)

둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션의 연산에 끼어들 수 없다.

4. 지속성(Durability)

트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다.

 

Commit

하나의 트랜잭션이 성공적으로 끝났고, DB과 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산

 

Rollback

하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산

 

트랜잭션 격리 수준(Isolation Level)

동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어있는지를 나타내는 것.

즉, 특정 트랜잭션이 다른 트랜잭션으로 인해 변경된 데이터에 접근하는 것의 허용여부를 결정하는 것.

 

DB는 트랜잭션이 독립적인 수행을 하도록 Locking을 통해 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다.

하지만, 무조건 Locking으로 동시에 수행되는 많은 트랜잭션을 순차적으로 수행시키면 DB의 성능이 떨어진다. 또한 성능을 높이기 위해 Locking의 범위를 과도하게 줄이면, 잘몬된 값이 처리되는 문제가 발생할 수 있다.

따라서 최대한 효율적인 Locking 방법이 필요하다.

 

Lock
트랜잭션 처리의 순차성을 보장하기 위한 방법(동시성 제어)
DBMS마다 Lock을 구현하는 방식이 다르기 때문에 사용하는 DB의 Lock에 대한 이해가 요구된다.
Shared(공유) Lock
데이터를 읽을 때, 사용되는 Lock
Shared Lock은 Shared Lock끼리 동시에 접근이 가능하지만, Shared Lock이 설정된 데이터에 Exclusive Lock을 사용할 수 없다.
Exclusive(배타) Lock
데이터를 변경할 때, 사용되는 Lock으로 트랜잭션이 완료될 때까지 유지된다.
Exclusive Lock은 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 데이터에 접근할 수 없다.

Isolation Level 종류

1. Read Uncommitted (level 0) -> 다른 트랜잭션에서 Commit되지 않은 내용 접근 가능

  • SELECT 문이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
  • 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
  • DB의 일관성을 유지하는 것이 불가능하다.
  • Dirty Read, Non-Repeatable Read, Phantom Read가 발생할 수 있다.

 

2. Read Committed (level 1) -> 다른 트랜잭션에서 Commit된 내용만 접근 가능

  • SELECT 문이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
  • 트랜잭션이 수행되는 동안, 다른 트랜잭션이 접근할 수 없기때문에 대기하게 된다.
  • Commit이 이루어진 트랜잭션만 조회가 가능하다.
  • Oracle DB, SQL Server에서 기본적으로 사용되는 Isolation Level이다.
  • Non-Repeatable Read, Phantom Read가 발생할 수 있다.

3. Repetable Read (level 2) -> 트랜잭션에 진입하기 이전에 Commit된 내용만 접근 가능

  • 트랜잭션이 완료될 때까지 SELECT 문이 사용되는 모든 데이터에 Shared Lock이 걸리는 계층
  • 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
  • 다른 사용하는 트랜잭션 영역에 대항되는 데이터에 대한 수정이 불가능하다.
  • Phantom Read가 발생할 수 있다.

4. Serializable (level 3) -> 트랜잭션에 진입하면 Lock을 걸어 다른 트랜잭션이 접근하지 못하게 막는다.

  • 가장 단순한 격리 수준이지만 가장 엄격한 격리 수준으로 Phantom Read가 발생하지 않는다.
  • 동시 처리 능력이 떨어지고 성능 저하로 인해 DB에서 거의 사용되지 않는다.

 

'CS > DB' 카테고리의 다른 글

Redis, Memcached  (0) 2022.08.31
RDBMS / NoSQL  (0) 2022.06.21
JOIN  (0) 2022.06.21
정규화  (0) 2022.06.21
DB에서 인덱스를 사용하는 이유  (0) 2022.06.18
Comments