본문 바로가기
DB

트랜잭션

by 요섹남 2023. 10. 14.

트랜잭션

트랜잭션은 하나의 논리적인 작업을 처리하기 위한 일련의 연산 집합으로서 데이터베이스에서 논리적인 작업의 단위가 된다.

 

Commit 연산

- 트랜잭션 처리가 정상적으로 종료되어 트랜잭션이 수행한 변경 내용을 데이터베이스에 반영하는 연산.

- 데이터를 변경한 트랜잭션이 완료되면, 그 트랜잭션에 의해 데이터베이스는 새롭게 일관된 상태로 변경되며, 이 상태는 시스템에 오류가 발생하더라도 취소되지 않는다.

 

Rollback 연산

- 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성이 깨졌을 때 트랜잭션이 행한 모든 변경 작업을 취소하고 이전 상태로 되돌리는 연산이다.

- 해당 트랜잭션은 받았던 자원과 잠금을 모두 반환하고, 재시작되거나 폐기된다.

 

SavePoint

- 트랜잭션 내에서 일부 작업을 세이브포인트로 지정하여, 해당 지점 이후의 변경 사항만 롤백할 수 있다.

 

트랜잭션의 특성(ACID)

1. 원자성(Atomicity)

- 트랜잭션의 모든 연산은 원자적으로 수행되어야한다.

- 트랜잭션이 완벽히 수행되면 commit 연산을 수행해서 반영한다.

- 트랜잭션 중간에 오류가 발생한다면 rollback 연산을 수행하여 원래의 상태로 돌아간다.

- 트랜잭션 내의 모든 명령어는 반드시 완벽히 수행되어야 한다.

 

2. 일관성(Consistency)

- 트랜잭션 전후에 데이터베이스는 일관된 상태를 유지해야 한다.

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

- 동시에 실행되는 트랜잭션이 없는 고립 상태에서의 트랜잭션 수행은 데이터베이스의 일관성을 유지해야한다.

 

3. 격리성(Isolation)

- 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 연산에 영향을 받지 않아야한다.

- 트랜잭션들이 동시에 수행되더라도 그 결과는 순차적으로 실행된 결과와 같아야한다.

 

4. 지속성(Durability)

- 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 한다.

- 시스템 장애 또는 기타 문제로 인해 데이터 손실이 발생하지 않아야 한다.

 

트랜잭션의 상태

1. 활동(Active) : 트랜잭션이 시작된 상태이다.

2. 부분 완료(Partially Committed) : 트랜잭션이 마지막 연산까지 실행되었고, 커밋 직전 상태이다.

3. 종료(Terminated) : 트랜잭션이 성공적으로 완료되었습니다. 이 상태에서는 결과가 지속적으로 저장된다.

4. 실패(Failed) : 트랜잭션이 비정상적으로 종료되었습니다. 롤백되어야 하며, 원자성을 만족시키기 위해 이전 상태로 복구 된다.

 

병행 제어

- 병행 제어란 동시에 여러 개의 트랜잭션을 병행 수행할 때 실행되는 트랜잭션들이 데이터베이스의 일관성을 유지하도록 상호 작용을 제어하는 기술.

- 데이터베이스의 공유를 최대화한다.

- 시스템의 활용도를 최대화한다.

- 사용자에 대한 응답 시간을 최소화한다.

- 단위 시간당 트랜잭션 처리 건수를 최대화 한다.

- 데이터베이스의 일관성을 유지한다.

jscode

1. 로크(Lock)-기반 병행제어:

  • 공유 락(Shared Lock) 및 배타적 락(Exclusive Lock): 트랜잭션이 데이터에 대한 락을 요청하고 획득함으로써 다른 트랜잭션의 접근을 제한합니다.
  • 데드락 검출 및 해결: 트랜잭션이 서로 락을 획득하고 대기하는 상태에서 발생하는 데드락을 검출하고 해결합니다.

2. 타임스탬프(Time-stamp)-기반 병행제어:

  • 타임스탬프 할당: 각 트랜잭션에 고유한 타임스탬프를 할당하여 어떤 트랜잭션이 먼저 실행되었는지를 추적합니다.
  • 타임스탬프 순서: 트랜잭션이 데이터를 읽거나 쓰는 순서를 타임스탬프를 통해 정의하고, 이를 기반으로 트랜잭션을 스케줄링합니다.

3. 격리 수준(Isolation Level):

  • Read Committed, Repeatable Read, Serializable 등의 격리 수준 설정: 트랜잭션 간의 격리 수준을 설정하여 어느 정도까지 데이터를 공유하고 차단할지를 결정합니다.

4. 다중 버전 병행제어(Multi-Version Concurrency Control, MVCC):

  • 버전 관리: 각 트랜잭션이 읽는 시점의 데이터 버전을 관리하여 동시성을 제어합니다. 다중 버전을 사용하여 한 트랜잭션이 데이터를 읽는 동안에도 다른 트랜잭션이 데이터를 변경할 수 있습니다.

5. 교착상태 감지 및 해결:

  • 데드락 검출과 해결 기법: 데드락이 발생할 경우, 시스템은 데드락을 검출하고 이를 해결하기 위한 방법을 적용합니다.

6. 스냅샷 격리(Snapshot Isolation):

  • 스냅샷을 통한 격리: 각 트랜잭션이 자신만의 스냅샷을 유지하고 다른 트랜잭션의 변경 사항이 반영되지 않은 시점의 데이터를 읽어오는 방식입니다.

 

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

- 일관성이 없는 데이터를 허용하는 수준을 이야기한다.

- 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다.

- 레벨이 높아질 수록 처리에 대한 비용이 증가하게 된다.

 

발생 가능한 문제점

  1. 더티 리드 (Dirty Read): 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 것을 더티 리드라고 합니다. 이로 인해 데이터 일관성이 깨질 수 있습니다.
  2. 비반복 가능한 읽기 (Non-Repeatable Read): 한 트랜잭션이 동일한 쿼리를 실행했을 때 결과가 다르게 나타나는 상황을 말합니다. 다른 트랜잭션이 중간에 데이터를 변경했기 때문에 발생합니다.
  3. 유령 읽기 (Phantom Read): 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때 결과 집합에 다른 데이터가 추가되는 상황을 말합니다. 다른 트랜잭션이 새로운 데이터를 추가했기 때문에 발생합니다.
  4. 데드락 (Deadlock): 두 개 이상의 트랜잭션이 서로 락을 획득한 상태에서 서로의 락을 기다리고 있어 계속 진행이 불가능한 상태입니다.
  5. 포스트 커밋 읽기 (Read Committed에서의): 다른 트랜잭션이 이미 커밋된 데이터를 현재 트랜잭션이 읽는 것을 말합니다. 다른 트랜잭션이 커밋한 직후에 발생합니다.

 

표준 격리 수준

1. Read Uncommitted (미커밋 읽기):

  • 특징: 가장 낮은 격리 수준이며, 트랜잭션이 수행 중인 데이터 변경 사항이 아직 커밋되지 않았더라도 다른 트랜잭션에서 읽을 수 있습니다.
  • 문제점: Dirty Read(더티 리드), Non-repeatable Read(반복할 수 없는 읽기) 등의 이슈가 발생할 수 있습니다.

2. Read Committed (커밋된 읽기):

  • 특징: 커밋된 데이터만 읽을 수 있습니다. Dirty Read를 방지하기 위해 트랜잭션이 커밋된 데이터만 읽을 수 있습니다.
  • 문제점: Non-repeatable Read와 Phantom Read(유령 읽기)는 여전히 발생할 수 있습니다.

3. Repeatable Read (반복할 수 있는 읽기):

  • 특징: 트랜잭션이 시작될 때 읽은 데이터를 트랜잭션이 종료될 때까지 변경할 수 없습니다. Non-repeatable Read는 방지되지만 Phantom Read가 발생할 수 있습니다.
  • 문제점: 다른 트랜잭션이 데이터를 추가하는 경우 Phantom Read 문제가 발생할 수 있습니다.

4. Serializable (직렬화 가능):

  • 특징: 가장 높은 격리 수준으로, 트랜잭션 간에 격리 수준이 완전히 보장됩니다. 모든 읽기와 쓰기 작업은 순차적으로 이루어집니다.
  • 문제점: 가장 높은 격리 수준이지만, 동시성이 크게 저하될 수 있으므로 성능상의 이슈가 발생할 수 있습니다.

'DB' 카테고리의 다른 글

DB Lock 와 DB Recovery  (0) 2023.10.14
이상현상, 함수적 종속성, 정규화  (0) 2023.10.14
인덱스 (Index)  (0) 2023.10.14
HDD와 SSD, 랜덤 I/O, 순차 I/O  (0) 2023.09.29
SQL 안티패턴, SQL Injection 공격  (0) 2023.09.21