15.TRANSACTION
by SANGGI JEON
TRANSACTION
- 정의
- DB에서 하나의 작업으로 처리되는 논리적 작업 단위
- DBMS의 Concurrency control과 Recovery에서 중요한 역할을 수행
1. ACID Property
- Atomicity: all or nothing. 하나의 단위로 처리되어야 함. (중간까지만 처리됨은 불가)
- Consistency: 데이터베이스의 일관성(무결성)을 깨지 않아야 함
- Isolation: 다른 Transaction과 동시에 수행되더라고 독립적으로 영향을 받지 않아야 함
- Durability: 한번 수행 완료(Commit)되면 영원히 반영되어 있어야 함
2. 구성
- DML(INSERT, UPDATE, DELETE)의 집합
- DDL이나 DCL은 한 문장이 트랜잭션으로 처리됨
3. 트랜잭션 정의
- 시작
- 명시적인 트랜잭션 시작 명령 없음 (ORACLE)
- 타 DBMS에서는 트랜잭션 시작을 명시함(MSSQL은 BEGIN TRAN으로 시작함)
- 첫 DML이 시작되면 트랜잭션 시작
- 명시적인 트랜잭션 시작 명령 없음 (ORACLE)
- 명시적 종료: COMMIT/ROLLBACK
- 묵시적 종료
- DDL, DCL 등이 수행될때(automatic commit)
- SQL *PLUS 등에서의 정상적 종료(automatic commit)
- 시스템 오류(automatic rollback)
4. State of Data
4.1 Before Commit/Rollback
- 현재 사용자는 DML의 결과를 볼 수 있음
- 다른 사용자는 현재 DML 결과를 볼 수 없다(변경 이전 버전이 보임. Read Consistency)
- DML에 의해 변경된 모든 row는 Lock이 걸림(다른 트랜잭션에서 수정 불가)
4.2 After Commit
- 변경이 영속적으로 DB에 반영됨. 이전 상태는 사라짐(더 이상 Rollback 불가)
- 변경 결과를 모든 사용자가 볼 수 있음
- 모든 Lock이 풀림, 모든 Savepoint 사라짐
4.3 After Rollback
- 모든 DML의 변경이 취소됨
- 모든 Lock이 풀림, 모든 Savepoint 사라짐
5. Isolation Level
- 여러 사용자가 동일한 데이터를 동시에 접근할때 발생하는 상황에 처리를 어떻게 할 것인지 정하는 격리 수준
5.1 Read Uncommitted (Level 0)
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리 않는 Level
- 각 트랜재잭션이 COMMIT이나 ROALLBACK 여부에 상관 없이 데이터를 읽을 수 있음
- DIRTY READ 현상 발생
- 트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
5.2 Read Committed (Level 1)
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 Level
- SQL Server가 디폴트로 사용하는 Level
- Dirty Read 현상 해결
- Non-Repeatable Read 현상이 발생
- 하나의 트랜잭션내에서 똑같은 SELECT을 실행했을 때 항상 같은 결과를 가져오지 못하는 현상
5.3 Repeatable Read
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level
- 트랜잭셔마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 됨
- PHANTOM READ 현상이 발생
- 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다하는 현상
- 이를 방지하기 위해서는 쓰기 잠금을 걸어야 함
5.4 SERIALIZABLE
-
트랜잭션이 끝날 때까지 조회, 생성, 수정, 삭제하는 것을 막음
-
가장 엄격한 격리 수준으로 성능 측면에서 처리 서능이 낮음
6. Deadlock
- 둘 이상의 트랜잭션이 서로 상대방의 Lock을 순환 대기하여 어떤 트랜잭션도 더 이상 진행할 수 없는 상태
- Oracle이 주기적으로 자동 detect하여 에러를 돌려줌
Subscribe via RSS