본문 바로가기
Computer Science/데이터베이스

트랜잭션의 개념과 고립 수준

by eunnnn 2023. 3. 26.

트랜잭션의 개념

트랜잭션은 데이터베이스 시스템에서 하나의 논리적 기능을 정상적으로 수행하기 위한 작업의 기본 단위이다.

하나의 작업을 수행하기 위해 필요한 데이터베이스 연산 기능들을 모아놓은 것이며 분리되지 않도록 하여 작업의 완전성을 보장한다.

 

트랜잭션을 통해서 데이터베이스의 회복과 병행 제어가 가능하다. 즉, 데이터베이스에서 오류가 발생하는 경우의 빠른 회복이나, 여러 사용자가 동시에 데이터베이스를 사용할 수 있도록 제어해주는 중요한 역할을 한다.  

 

트랜잭션의 특징

트랜잭션이 성공적으로 처리되기 위해서는 ACID라는 네 가지 성질을 만족해야 한다.

 

원자성 (Atomicity)

  • 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나, 모두 취소되어야 하는 성질
  • 하나의 트랜잭션에서 일부 연산만 실행될 수 없다 -> 트랜잭션의 연산 전체가 성공 또는 실패(All or Nothing) 되어야 함
  • savePoint 지정을 통해 중간까지의 트랜잭션을 복구할 수 있다.

일관성 (Consistency)

  • 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 데이터가 일관성이 있어야 한다. (서로 모순이 있어서는 안된다)
    은행 송금 기능을 생각해보면, 트랜잭션 수행 이전의 송금자와 수금자의 잔액 합이 수행 후에 달라지거나, 혹은 잔액을 나타내는 자료형이 정수형에서 문자열로 바뀌는 등의 모순이 발생하면 안 된다. 

격리성, 고립성 (Isolation)

  • 동시에 실행되는 트랜잭션들은 서로 영향을 미치지 않아야 한다
  • 둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행 중인 트랜잭션이 완료되기 전에 현재 트랜잭션이 생성한 중간 연산 결과를 다른 트랜잭션이 접근하면 안 된다. 

지속성(Durability)

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

 

트랜잭션의 연산

트랜잭션 연산에는 Commit, Rollback이 있다.

 

Commit : 하나의 트랜잭션이 성공적으로 종료된 후, 데이터베이스가 일관된 상태를 유지할 때 연산이 완료되었다고 트랜잭션 관리자에게 알려주고 결과를 최종적으로 데이터베이스에 반영하는 연산

Rollback : 트랜잭션이 비정상적으로 종료되어 일관성을 잃었을 때 트랜잭션이 지금까지 지금까지 실행한 연산의 결과를 취소하고 트랜잭션 이전의 상태로 돌아가는 연산

 

트랜잭션의 상태

  • 활성화(Active) : 트랜잭션이 작업을 시작하여 실행 중인 상태
  • 부분 완료(Partially commited) : 트랜잭션의 마지막 연산까지 실행하고 commit 요청이 들어온 직후의 상태. 최종 결과를 데이터베이스에 아직 반영하지 않은 상태.
  • 완료(Commited) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태
  • 실패(Failed) : 트랜잭션에 오류가 발생하여 실행이 중단된 상태
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

 


Transaction Isolation Level

데이터베이스는 ACID 특징을 가지고 트랜잭션이 독립적인 수행을 하도록 한다. 따라서 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 이를 막는 것이 필요하다. 이를 얼마나 막고, 얼마나 허용할지를 정해놓은 수준을 트랜잭션 고립 수준(Transaction Isolation Level)이라고 한다. 

고립 수준이 높을 수록 일관성은 보장되지만 그만큼 동시성이 떨어져 성능 하락으로 이어질 수 있다.

 

낮은 수준의 Isolation Level을 사용할 때 발생할 수 있는 이상 현상은 다음과 같다.

  1. Dirty Read : 어떤 트랜잭션에서 아직 실행이 끝나지 않은 트랜잭션에 의한 변경사항을 보게 되는 경우
  2. Non Repeatable Read : 어떤 트랜잭션이 같은 쿼리를 2번 실행하는데 그 사이에 다른 트랜잭션이 수정/삭제를 하여 같은 쿼리에 다른 값이 나오는 경우
  3. Phantom Read : 어떤 트랜잭션이 같은 범위의 레코드를 2번 읽었는데 그 사이에 없던 레코드가 추가되어 같은 쿼리에 다른 값이 나오는 경우
    트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타나는 현상이다.

 

Isolation Level의 종류는 Read Uncommited, Read Commited, Repeatable Read, Serializable이 있다.

 

Read Uncommited

  • 트랜잭션 수행 중이거나 아직 commit 되지 않은 데이터를 다른 트랜잭션에서 Read 하는 것을 허용
  • Dirty Read, Non Repeatable Read, Phantom Read 발생 가능

Read Commited

  • 트랜잭션 수행이 완료되고 commit 된 데이터만 다른 트랜잭션에서 Read하도록 허용
  • 일반적으로 DBMS에서 Default로 설정하는 레벨
  • Non Repeatable Read, Phantom Read 발생 가능

Repeatable Read

  • 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제 (Update/Delete)가 불가능하다.
  • 삽입(Insert)은 가능하다.
  • Phantom Read 발생 가능

Serializable

  • 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입 모두 불가능하다.
  • 모든 이상 현상 방지 가능
  • 하지만 그만큼 동시성이 떨어져서 성능이 하락함

 

출처

더보기

'Computer Science > 데이터베이스' 카테고리의 다른 글

데이터베이스 락(Lock)  (0) 2023.06.18
관계형 데이터베이스 설계 - 1:1, 1:N, 1:M  (0) 2023.03.27
데이터베이스 JOIN  (2) 2023.03.26
데이터베이스 인덱스  (0) 2023.03.25
데이터베이스 정규화  (0) 2023.03.25