트랜잭션이란?
트랜잭션은 데이터베이스에서 데이터를 안전하게 처리하기 위한 작업의 논리적 단위를 말합니다.
트랜잭션 ACID 원리
트랜잭션 ACID는 데이터베이스에서의 트랜잭션 처리를 위한 속성들을 설명하는 약어입니다. 각각의 속성은 다음과 같은 의미를 가집니다:
- 원자성 (Atomicity):
- 트랜잭션의 모든 연산은 원자적으로 실행되어야 합니다.
- 즉, 트랜잭션 내의 모든 연산은 전부 성공하거나 실패해야 하며, 중간에 일부만 성공하는 경우는 없어야 합니다.
- 예를 들어, 어떤 계좌에서 돈을 출금하여 다른 계좌로 입금하는 트랜잭션이 있다면, 출금과 입금 모두가 성공해야 트랜잭션이 성공한 것으로 간주됩니다.
- 만약 입금이 성공하고 출금이 실패하는 경우, 트랜잭션은 롤백되어야 합니다.
- 일관성 (Consistency):
- 트랜잭션의 실행이 데이터베이스를 일관된 상태로 유지해야 합니다.
- 즉, 트랜잭션 전후에 데이터베이스는 모든 제약 조건을 만족해야 합니다.
- 예를 들어, 어떤 계좌 간 이체 트랜잭션에서 잔액이 음수가 되는 경우는 없어야 합니다.
- 고립성 (Isolation):
- 하나의 트랜잭션이 실행 중일 때, 다른 트랜잭션들이 해당 트랜잭션의 연산을 간섭하지 않아야 합니다.
- 트랜잭션은 서로 영향을 주거나 받지 않는 독립적인 실행이 보장되어야 합니다.
- 지속성 (Durability):
- 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다.
- 시스템 장애나 다른 문제로 인해 발생할 수 있는 데이터 손실을 방지하기 위해, 트랜잭션의 결과는 영구적으로 저장되어야 합니다.
이러한 ACID 속성은 데이터베이스 시스템에서 데이터 무결성과 안정성을 보장하기 위해 사용됩니다.
트랜잭션 격리수준
트랜잭션 격리수준은 동시에 여러 트랜잭션이 발생할 때, 각 트랜잭션이 다른 트랜잭션의 영향을 받지 않도록 하는 수준을 나타냅니다. 데이터베이스 시스템에서는 다양한 격리수준을 제공하여 사용자가 트랜잭션 간의 상호작용을 제어할 수 있습니다. 널리 사용되는 네 가지 격리수준은 다음과 같습니다:
- READ UNCOMMITTED (커밋되지 않은 읽기):
- 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수 있습니다.
- 가장 낮은 격리수준이며, 다른 트랜잭션의 변경 사항에 대한 고려 없이 데이터를 읽을 수 있습니다.
- 따라서 데이터의 무결성과 일관성이 보장되지 않습니다.
- READ COMMITTED (커밋된 읽기):
- 다른 트랜잭션이 커밋된 데이터만을 읽을 수 있습니다.
- 한 트랜잭션에서 데이터를 변경한 후, 다른 트랜잭션이 해당 변경 내용을 볼 수 있습니다.
- Dirty Read(더티 리드) 문제는 발생하지 않지만, Non-Repeatable Read(반복할 수 없는 읽기)와 Phantom Read(유령 읽기) 문제가 발생할 수 있습니다.
- REPEATABLE READ (반복 가능한 읽기):
- 동일한 쿼리를 반복하여 실행해도 결과가 일관성을 유지합니다.
- 한 트랜잭션에서 조회한 데이터는 다른 트랜잭션에서 변경되더라도 그 조회 결과가 변경되지 않습니다.
- Non-Repeatable Read 문제는 발생하지 않지만, Phantom Read 문제는 발생할 수 있습니다.
- SERIALIZABLE (직렬화 가능):
- 가장 높은 격리수준으로, 트랜잭션 간의 동시성을 완전히 제거합니다.
- 모든 트랜잭션은 순차적으로 실행되는 것처럼 처리되어, 각 트랜잭션이 다른 트랜잭션의 변경을 볼 수 없습니다.
- 이 격리수준은 Non-Repeatable Read와 Phantom Read 문제를 완전히 방지하지만, 동시성이 크게 저하될 수 있습니다.
트랜잭션 격리수준은 데이터베이스 시스템의 성능과 일관성 사이의 트레이드 오프를 조절하는 데 사용됩니다. 보다 높은 격리수준은 데이터 일관성을 높이지만 성능을 저하시킬 수 있으며, 보다 낮은 격리수준은 성능을 향상시키지만 데이터 일관성을 희생할 수 있습니다.
트랜잭션 격리 수준에 따른 문제
트랜잭션 격리수준은 데이터베이스에서 동시성을 관리하는 방식을 결정하므로, 각 격리수준에는 특정 문제가 발생할 수 있습니다. 여러 격리수준에서 발생할 수 있는 일반적인 문제들은 다음과 같습니다:
- Dirty Read (더티 리드):
- 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽는 현상입니다.
- 한 트랜잭션이 데이터를 변경하고 커밋하지 않은 상태에서 다른 트랜잭션이 해당 데이터를 읽으면, 변경된 내용이 롤백될 경우 문제가 발생합니다.
- Non-Repeatable Read (반복할 수 없는 읽기):
- 동일한 쿼리를 반복하여 실행했을 때, 결과가 다른 현상입니다.
- 한 트랜잭션이 데이터를 읽은 후 다른 트랜잭션이 해당 데이터를 변경하고 커밋하면, 첫 번째 트랜잭션이 같은 데이터를 다시 읽으면 이전과 다른 결과를 얻을 수 있습니다.
- Phantom Read (유령 읽기):
- 동일한 쿼리를 반복하여 실행했을 때, 결과 행이 추가 또는 제거되는 현상입니다.
- 한 트랜잭션이 데이터 범위를 조회한 후 다른 트랜잭션이 해당 범위에 새로운 데이터를 추가하거나 제거하고 커밋하면, 첫 번째 트랜잭션은 같은 범위를 다시 조회할 때 새로운 데이터가 나타날 수 있습니다.
이러한 문제들은 각 격리수준에서 발생 가능하며, 더 높은 격리수준은 이러한 문제들을 방지하기 위해 더 많은 비용을 치러야 할 수 있습니다. 따라서 격리수준을 선택할 때에는 데이터의 일관성과 동시성 요구 사항을 고려해야 합니다.
'데이터베이스' 카테고리의 다른 글
MySQL/MariaDB, 테이블 락 최소화하여 변경하기 (0) | 2024.07.03 |
---|