트랜잭션(Transaction)이란?
- 트랜잭션은 업무처리를 위한 논리적인 작업 단위를 말합니다.
1. 트랜잭션의 특징
1. 원자성(Atomicity)
: 트랜잭션은 더이상 분해가 불가능한 업무의 최소 단위이므로, 전부 처리되거나, 아예 하나도 처리되지 않아야 합니다.
2. 일관성(Consistency)
: 일관된 상태의 데이터베이스에서 하나의 트랜잭션이 성공적으로 작업을 완료하고 난 후에도 데이터베이스는 여전히 일관된 상태여야 합니다.
3. 격리성,독립성(Isolation)
: 하나의 트랜잭션이 작업을 하고 있을 때 다른 트랜잭션은 접근할 수
없습니다.
가. 낮은 단계의 격리성 수준에서 발생할 수 있는 현상들입니다.
1) Dirty Read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은데이터를 읽는 것을 의미합니다.
2) Non-Repeatable Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정,삭제하여 두 쿼리의 결과가 다르게 나타나는 현상입니다.
3) Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상입니다.
나. 트랜잭션의 격리성 수준
1) Read Uncommitted : 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용하는 것 입니다.
2) Read Committed : 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써, Dirty Read를 방지해줌. 하지만, 커밋된 데이터만 읽더라도 Non-Repeatable Read와 Phantom Read현상을 막지 못합니다.
3) Repeatable Read : 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 줍니다. 하지만, Phantom Read 현상을 막지 못합니다.
4) Serializable Read : 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나, 값이 바뀌지 않음은 물론, 세로운 레코드가 나타나지도 않습니다.
레벨 | Dirty Read | Non-Repeatable Read | Phantom Read |
Read Uncommitted | 가능 | 가능 | 가능 |
Read Committed | 불가능 | 가능 | 가능 |
Repeatable Read | 불가능 | 불가능 | 가능 |
Serializable Read | 불가능 | 불가능 | 불가능 |
4. 영속성(Durability)
: 트랜잭션이 일단 실행을 성공적으로 완료하면, 그 결과는 데이터베이스에 영속적으로 저장되어야 합니다.
※ 주의사항
- 모든 DBMS가 4가지 레벨을 다 지원하지 않습니다
- SQL Server와 DB2는 4가지 레벨을 다 지원하지만, 오라클은 Read Committed와 Serializable Read만 지원합니다.
- (Oracle에서 Repeatable Read를 구현하려면 for update 구문을 이용하면 됩니다.)
- 대부분의 DBMS는 Read Committed를 기본 트랜잭션 격리성 수준으로 사용하고 있습니다.