본문 바로가기
Computer Science/Data Base

[DB] Transaction

by 기몬식 2023. 11. 2.

Transaction

트랜잭션은 데이터베이스에서의 상호 작용의 단위이며 하나 이상의 작업을 처리하는 개념으로 데이터베이스의 무결성과 데이터의 일관성을 보장하기 위한 단위를 의미합니다.
트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위를 구성하는 연산들의 집합입니다.

  1. 데이터베이스에서 수행되는 일련의 여러 작업이며 모두 단일 논리적 작업 단위로 사용됩니다.
  2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위입니다.
  3. 하나의 트랜잭션은 Commit 되거나 Rollback 됩니다.

트랜잭션은 "전체"로 처리하려는 작업 단위이며 이는 완전히 일어나거나 전혀 일어나지 않아야 합니다.

동작

데이터베이스는 초당 수백만 개의 동시 요청을 처리하며 대부분의 경우 이런 요청들은 데이터베이스의 동일한 항목에 적용됩니다.
데이터베이스의 무결성과 데이터의 일관성을 보장하기 위해 등장한 트랜잭션은 아래와 같이 동작합니다.

트랜잭션은 수명 주기 동안 여러 상태를 거치는데 이러한 상태를 트랜잭션 상태 라고 하며 다음과 같습니다.

출처

  1. Active State: 트랜잭션이 시작되고 데이터베이스 작업을 수행하는 초기 상태입니다. 데이터베이스에 대한 읽기 및 쓰기 작업을 수행하며 활성 상태에서는 트랜잭션은 아직 커밋되지 않았으며 롤백을 통해 트랜잭션을 취소할 수 있습니다.
  2. Partially Committed: 트랜잭션의 일부 작업이 성공적으로 완료되었고 일부 작업은 아직 완료되지 않은 상태입니다. 완료된 작업은 이미 데이터베이스에 영구적으로 적용되었지만 나머지 작업은 롤백을 할 수 있으며 데이터가 메모리 버퍼에 존재합니다. 트랜잭션 작업이 완료된 후에도 여전히 오류가 발생할 수 있기 때문에 전체 트랜잭션 결과를 반영하지 않을 수 있다는 점에서 Committed 상태와 다릅니다.
  3. Committed: 트랜잭션의 모든 작업이 성공적으로 완료되었고 모든 작업이 데이터베이스에 반영되어 영구적으로 저장됩니다. 커밋 후에는 트랜잭션은 종료 상태로 이동하게 됩니다.
  4. Failure: 어떤 이유로 작업이 실패하거나 활성 상태 또는 부분적으로 커밋된 상태에서 중단된 경우 실패 상태가 됩니다. 작업 중 하나라도 예외가 발생한 경우, 시스템 장애, 데드락 등의 이유로 발생할 수 있으며 실패한 트랜잭션은 롤백을 통해 이전 상태로 복구할 수 있습니다.
  5. Terminated State: 트랜잭션의 동작이 완료되고 커밋되었거나 롤백되었을 때 종료된 상태입니다. 즉 해당 상태는 더 이상 활성 상태가 아니며 데이터베이스 작업에 대한 모든 영향은 영구적으로 반영되었거나 취소되었습니다. 이는 데이터베이스 트랜잭션 수명 주기의 끝을 나타냅니다.

ACID

ACID는 데이터베이스 시스템에서 트랜잭션의 네 가지 속성을 나타내는 개념입니다.
데이터베이스에 있는 데이터의 정확성과 무결성을 보장하여 일부 오류로 인해 데이터가 손상되지 않도록 하고 오류나 오류가 발생하는 경우에도 데이터의 유효성을 보장합니다.
ACID 속성을 통해 데이터의 오류, 복구 및 동기화 대신 애플리케이션 논리에 집중할 수 있습니다.

출처

Atomicity

원자성은 트랜잭션 작업 단위는 원자 단위여야함을 나타내는 속성으로 수정된 모든 데이터가 수행되지 않으면 그 중 어느 것도 수행되지 않음을 나타냅니다.
트랜잭션은 완전히 실행되거나 완전히 실패해야 하며 트랜잭션의 한 부분이 실패하면 트랜잭션이 롤백됩니다.
오류가 발생하는 경우 해당 트랜잭션의 어떤 변경 사항도 커밋되지 않기 때문에 안정성을 제공합니다.
원자성은 중간 단계의 작업이 데이터베이스에 영구적인 변화를 만들지 않도록 보장합니다.

Consistency

일관성은 트랜잭션 이전과 이후의 데이터베이스 상태가 미리 정의된 규칙과 제약 조건을 준수해야 하는 특성입니다.
즉 데이터 무결성 제약 조건을 유지하여 데이터 일관성을 유지하도록 보장합니다.
트랜잭션 실행 전후에 데이터베이스는 일관된 상태여야 하며 트랜잭션은 데이터베이스를 유효한 상태로 유지해야 합니다.
트랜잭션으로 인해 데이터가 유효하지 않은 상태가 되면 트랜잭션이 중단되고 오류가 보고됩니다.

Isolation

격리성은 다중 트랜잭션이 실행 중일 때 각 트랜잭션은 다른 트랜잭션의 작업에 간섭 받지 않고 자신의 작업을 독립적으로 수행하는 것을 보장하는 특성입니다.
즉 해당 트랜잭션이 다른 동시 트랜잭션에 의해 변경되지 않으며 실행이 완료될 때까지 방해를 받지 않는다는 것을 의미합니다.

Isolation Level

격리 수준은 트랜잭션 간의 상호 작용 정도를 조절하는데 사용됩니다.
다중 사용자 환경에서 여러 트랜잭션이 동시에 실행될 때 트랜잭션 간의 상호작용을 제어하는 수준을 의미합니다.
높은 수준의 격리성은 ACID 속성을 지키기 위한 트랜잭션의 점유율이 높아짐에 따라 다른 모든 트랜잭션은 대기 상태에 머물기 때문입니다.
높은 격리 수준은 다음과 같은 문제점을 가집니다.

  1. 동시성 처리에 대한 성능이 떨어집니다.
  2. Deadlcok이 발생할 확률이 높아집니다.
  3. Lock으로 인한 시스템 오버헤드가 증가합니다.

따라서 성능 저하를 막기 위해서 트랜잭션 격리 수준을 나누어 ACID 특성을 타이트하게 유지하지 않게끔 만듭니다.

Read Uncommitted

가장 낮은 격리 수준으로 다른 트랜잭션에서 변경 중인 데이터에 대한 읽기가 허용됩니다.
Commit 이나 Rollback 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있으므로 데이터 일관성이 떨어질 수 있습니다.
즉 트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상인 Dirty Read 현상이 발생합니다.

Read Committed

다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
Dirty Read가 발생하지 않으며 Undo 영역의 백업된 레코드에서 값을 가져옵니다.
현재 트랜잭션 내에서 동일한 데이터를 읽을 때에는 동시성 문제로 인해 일관성이 유지되지 않을 수 있습니다.

Repeatable Read

동일한 트랜잭션 범위 내에서 동일한 데이터를 읽을 때는 항상 동일한 결과를 반환합니다.
트랜잭션은 고유한 번호를 가지며 Undo 영역에 백업된 모든 레코드에는 변경을 발생시킨 트랜잭션의 번호가 포함되어 있습니다.
다른 트랜잭션이 쓰기 작업을 수행하더라도 현재 트랜잭션 내에서 동일한 데이터를 읽을 때에는 일관성이 유지됩니다.
하나의 트랜잭션 안에서 일어나는 모든 읽기 작업은 자신의 트랜잭션 번호보다 작은 트랜잭션 번호에서 변경한 사항들만 볼 수 있습니다.

Serialized

가장 높은 격리 수준으로 트랜잭션 간의 상호작용을 가장 엄격하게 제어합니다.
모든 작업을 하나의 트랜잭션에서 처리하는 것과 같이 동작하는 가장 높은 트랜잭션 격리 수준으로 다른 트랜잭션의 작업을 완전히 무시하고 일관성을 가장 엄격하게 유지합니다. 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없습니다. 따라서 어떠한 데이터 부정합 문제도 발생하지 않지만 동시성 처리 성능이 매우 떨어집니다.

Durability

지속성은 트랜잭션이 완료되고 커밋되면 해당 변경 사항이 데이터베이스에 영구적으로 유지됨을 보장하는 속성입니다.
이 속성은 데이터베이스에 저장된 정보가 다른 업데이트 또는 삭제 트랜잭션에 영향을 미칠 때까지 변경할 수 없도록 보장하기 때문에 데이터베이스의 안정성을 보장하고 데이터 손실을 방지합니다.
완료된 트랜잭션은 하드 드라이브와 같은 비휘발성 메모리 장치에 기록되므로 인스턴스를 다시 시작하더라도 데이터를 항상 보관하고 있습니다.

오탈자 및 오류 내용을 댓글 또는 메일로 알려주시면, 검토 후 조치하겠습니다.

'Computer Science > Data Base' 카테고리의 다른 글

[DB] 정규화(Nomalization)  (1) 2023.11.17
[DB] 인덱스(Index)  (1) 2023.11.15
[DB] Lock  (2) 2023.11.09