트랜잭션의 ACID 속성
트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위. 트랜잭션이 성공적으로 완료되면, 데이터베이스의 상태는 일관되게 유지.
트랜잭션의 ACID 속성:
1. Atomicity (원자성):
* 트랜잭션의 모든 작업이 완벽하게 수행되거나 전혀 수행되지 않아야 함을 의미. 중간에 오류가 발생하면 트랜잭션은 롤백되어 이전 상태로 돌아간다.
* 예: 은행 계좌 이체에서 송금과 입금 작업이 모두 성공하거나 둘 다 실패해야함.
2. Consistency (일관성):
* 트랜잭션이 실행되기 전과 후에 데이터베이스는 일관된 상태여야 한다. 모든 데이터 무결성 제약 조건이 유지되어야 한다.
* 예: 트랜잭션이 완료된 후에도 모든 외래 키 제약 조건이 충족되어야 한다.
3. Isolation (격리성):
* 트랜잭션이 다른 트랜잭션의 중간 결과를 볼 수 없게 보장. 각 트랜잭션은 독립적으로 실행되는 것처럼 보여야 함.
* 예: 두 트랜잭션이 동시에 실행될 때, 서로의 데이터를 보거나 변경하지 않도록 보장함.
4. Durability (지속성):
* 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장됌. 시스템 장애가 발생하더라도 트랜잭션의 결과는 유지된다.
* 예: 트랜잭션이 완료된 후 데이터베이스가 시스템 충돌로 재시작되더라도 변경 내용은 유지된다.
동시성 제어 메커니즘
동시성 제어 메커니즘은 여러 트랜잭션이 동시에 실행될 때 데이터베이스의 일관성을 유지하는 방법을 제공.
주요 메커니즘은 잠금과 교착 상태.
1. 잠금(Locking):
* 데이터베이스의 특정 부분에 대해 액세스를 제어하여 트랜잭션 간의 충돌을 방지.
* 공유 잠금 (Shared Lock): 여러 트랜잭션이 동시에 읽을 수 있지만 쓸 수는 없다.
* 배타 잠금 (Exclusive Lock): 한 트랜잭션만 읽고 쓸 수 있다.
* 잠금은 성능 저하를 유발할 수 있으므로 효율적으로 관리해야 한다.
2. 교착 상태(Deadlock):
* 두 개 이상의 트랜잭션이 서로의 잠금을 기다리며 무한 대기 상태에 빠지는 상황.
* 교착 상태 해결 방법:
* 타임아웃: 일정 시간이 지나면 트랜잭션을 취소.
* 교착 상태 회피: 자원을 할당할 때 교착 상태를 피하는 알고리즘을 사용한다.
격리 수준 (Isolation Levels)
격리 수준은 트랜잭션 간의 상호 간섭을 제어하는 정도를 정의한다. 격리 수준이 높을수록 데이터 일관성이 강화되지만, 성능이 저하될 수 있다.
1. READ UNCOMMITTED:
* 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다.
* 문제: "더러운 읽기" (Dirty Read) 발생 가능
* 예: 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 경우
2. READ COMMITTED:
* 트랜잭션이 커밋된 데이터만 읽을 수 있다.
* 문제: "반복 불가능한 읽기" (Non-Repeatable Read) 발생 가능
* 예: 한 트랜잭션이 데이터를 읽은 후 다른 트랜잭션이 그 데이터를 수정하면, 첫 트랜잭션이 다시 읽을 때 다른 결과가 나올 수 있다.
3. REPEATABLE READ:
* 트랜잭션이 시작된 후 다른 트랜잭션이 데이터를 수정할 수 없습니다. 같은 트랜잭션 내에서 읽은 데이터는 항상 동일.
* 문제: "팬텀 읽기" (Phantom Read) 발생 가능
* 예: 한 트랜잭션이 데이터를 읽은 후 다른 트랜잭션이 새로운 데이터를 삽입하면, 첫 트랜잭션이 같은 조건으로 데이터를 다시 읽을 때 추가된 데이터를 볼 수 있다.
4. SERIALIZABLE:
* 가장 높은 격리 수준. 트랜잭션이 직렬화된 것처럼 순차적으로 실행된다.
* 장점: 모든 트랜잭션이 완전히 격리된다.
* 문제: 성능 저하 발생 가능
댓글