데이터 베이스 객체들에 대한 일련의 판독(Read)또는 기록(Write)
트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않음을 보장
실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지됨을 보장
트랜잭션 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장
성공적으로 수행된 트랜잭션은 영구적으로 데이터베이스에 반영됨을 보장
트랜잭션의 격리성은 여러 트랜잭션이 동시에 실행될 때, 서로 간섭하지 않도록 보장하는 중요한 특성이다. 이를 통해 데이터의 일관성을 유지할 수 있다. 격리성을 구현하기 위해 Lock(잠금)이 사용되며, 트랜잭션 간의 충돌이나 데이터 무결성 문제를 방지하는 역할을 한다.
잠금은 트랜잭션이 데이터를 읽거나 수정할 때, 해당 데이터에 대한 보호를 제공한다. 잠금 방식에는 공유 잠금(Shared Lock)과 배타적 잠금(Exclusive Lock)이 있다.
• 공유 잠금(Shared Lock): 데이터를 읽을 수는 있지만, 다른 트랜잭션이 해당 데이터를 수정할 수는 없다.
• Dirty Read: 한 트랜잭션이 데이터를 업데이트하는 도중, 다른 트랜잭션이 그 데이터를 읽어 부정확한 정보를 조회하는 현상이 발생할 수 있다.
• Repeatable Read: 동일 트랜잭션 내에서 동일한 데이터를 여러 번 조회해도 결과가 변하지 않도록 보장하는 격리 수준이다. 다만, Phantom Read가 발생할 수 있는데, 이는 다른 트랜잭션의 삽입이나 삭제로 인해 같은 쿼리가 서로 다른 결과를 반환하는 현상이다.
• 배타적 잠금(Exclusive Lock): 데이터를 수정할 수는 있지만, 읽기와 쓰기가 모두 제한된다. 이는 데이터의 무결성을 강력하게 보호하지만 성능에 영향을 줄 수 있다.
대부분의 트랜잭션에서 읽기(R)의 경우 Shared Lock을 적용하고 쓰기(W)의 경우 Exclusive Lock을 적용한다.
Shared Lock - SELECT에 적용됨
Exclusive Lock - UPDATE, DELETE, INSERT 등의 갱신 쿼리에 적용됨
학번 이외의 테이블 인덱스 역할의 컬럼이 있으면, 2개 이상의 사용자가 insert 시 트랜잭션 오류가 발생할 수 있다. → 동시성 제어
| Student | |
|---|---|
| sid | student_id |
| 1 | 20190001 |
| 2 | 20190002 |
@id = SELECT MAX(sid) FROM Student; INSERT INTO (@id + 1, ...); # 2개 이상의 사용자가 동시에 삽입 시 # 같은 @id를 얻게 될 수 있다.
race condition 상황이 발생했을 때, 운영체제는 동시성 제어를 위해 뮤텍스, 세마포어로 critical section에 접근해 수행할 트랜잭션에 대한 잠금(Locking)을 수행한다.
트랜잭션 격리 수준(Transaction Isolation Level)은 트랜잭션들이 얼마나 고립되어 있는지를 나타내는 것으로, 특정 트랜잭션이 다른 트랜잭센에 의해 변경된 데이터를 볼 수 있도록 허용할 지 말지를 결정한다.
| Level | Dirty Read | Non-Repeatable Read | Phantom |
|---|---|---|---|
| READ UNCOMMITTED | 가능성 있음 | 가능성있음 | 가능성있음 |
| READ COMMITTED | 불가 | 가능성 있음 | 가능성 있음 |
| REPEATABLE READ | 불가 | 불가 | 가능성 있음 |
| SERIALIZABLE | 불가 | 불가 | 불가 |