오라클 교육과정을 통해 DB를 처음 시작하다 보니, 트랜잭션이나 Lock 관리 중요성에 대해서는 전혀 인지하지 못하고 있었다.
교육과정에서 언급도 되지 않고 지나갔던 것으로 기억한다. 동시성 제어와 관련하여 Undo에 대해서만 열심히 공부했던 기억이 난다.
트랜잭션과 Lock 관련하여 너무 간과하고 있었던 것 같아서 공부를 위해 내용을 정리해 본다.
[참고 도서 : 오라클 성능고도화 원리와 해법 I]
#ANSI/ISO SQL standard에서 정의하고 있는 4가지 트랜잭션 고립화 수준
1) 0 레벨 (리드 언커밋티드(Read Uncommitted))
- Dirty Read, Non-Repeatable Read, Phantom Read 발생
- Oracle 지원하지 않음
2) 1 레벨 (리드 커밋티드(Read Committed))
- Dirty Read qkdwl
- 대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
- DB2, SQL Server, Sybase의 경우 읽기 공유 Lock을 이용하여 구현. 하나의 레코드를 읽을 때 Lock을 설정하고 해당 레코드를 빠져 나가는 순간 Lock 해재
-Oracle은 Lock을 사용하지 않고 Undo 데이터를 제공하는 방식으로 구현
3) 2 레벨 (리피터블 리드(Repeatable Read))
- 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때 까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두번 쿼리했을 때 일관성있는 쿼리를 리턴
-팬텀 리드(Phantom Read) 현상은 여전히 발생
-DB2, SQL Server의 경우 트랜잭션 고립화 수준을 Repeatable Read로 변경하면 읽은 데이터에 걸린 공유 Lock을 커밋할 때 까지 유지하는 방식으로 구현.
-Oracle은 이 레벨을 명시적으로 지원하지 않지만 for update절을 이용하여 구현 가능.
4) 3 레벨 (시리얼라이저블 리드(Serializable))
-선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막아줌.
-완벽한 읽기 일관성 모드를 제공.
* 오라클은 트랜잭션 고립화 수준을 높이더라도 Lock을 사용하지 않으므로 동시성이 저하되지 않는다.
Undo 데이터를 활용함으로써 높은 수준의 동시성과 읽기 일관성을 유지하는 대신 다른 DBMS에 없는 Snapshot too old가 발생한다.
'Database(DB)' 카테고리의 다른 글
[DBeaver] 무료 DB툴 디비버 단축키 - 쿼리 줄바꿈 (1) | 2024.12.03 |
---|