[Transaction] 트랜잭션과 트랜잭션 격리성 공부하기
2023. 4. 11. 10:44ㆍ몰랐던거/DB
트랜잭션이란?
트랜잭션은 DB의 상태 변화를 위해 수행되는 가장 작은 더 이상 쪼개질 수 없는 작업 단위입니다.
하나의 트랜잭션이 가진 작업들은 한 몸처럼 동작해야 하기 때문에 실패하면 전부 다 없던 작업으로 처리(RollBack)하고 성공하면 DB에 반영(Commit)합니다.
트랜잭션의 특성
트랜잭션은 아래의 4가지 특성을 가집니다.
- 원자성 (Atomicity) : 더 이상 쪼개지지 않는 최소 작업의 단위입니다.
- 일관성 (Consistency) : 일관된 DB에서 트랜잭션이 성공된 후에도 DB가 일관되어야 합니다. 트랜잭션의 결과로 DB가 모순되면 안됩니다.
- 격리성 (Isolation) : 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없습니다.
- 영속성 (Durability) : 트랜잭션이 성공하면 그 결과가 DB에 영속적으로 저장되어야 합니다.
트랜잭션의 격리성
특성에서 격리성은 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다라고 했습니다.
하지만 무조건 접근할 수 없다가 아닌 트랜잭션의 접근 레벨에 따라 다르게 설정이 가능합니다. 격리성이 더 강하게도 더 약하게도 설정될 수 있습니다.
이런 트랜잭션 접근 레벨 설정에 따라서 너무 약하게 설정했을 때 발생하는 문제점들이 있습니다.
- Dirty Read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 문제.
- Non-Repeatable Read : 하나의 트랜잭션에서 하나의 로우를 2번 읽었을 때 그 결과값이 다르게 나타나는 문제.
- Phantom Read : 하나의 트랜잭션에서 2번의 데이터 조회 시 이전 조회에서 존재하지 않던 로우가 나타나는 문제.
트랜잭션 접근 레벨
트랜잭션의 접근 레벨에 따른 설정 범위와 발생할 수 있는 문제를 알아보겠습니다.
- Read Uncommitted (Level 0) : 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 수 있는 레벨입니다. 발생할 수 있는 문제는 Dirty Read, Non-Repeatable Read, Phantom Read가 있고 이는 정합성에 문제가 발생할 수 있기 때문에 권장하지 않습니다.
- Read Committed (Level 1) : 트랜잭션에서 커밋된 데이터를 읽을 수 있는 레벨입니다. 커밋되지 않은 데이터는 Undo 로그에 있는 이전 데이터를 읽어오고 그래서 Non-Repeatable Read와 Phantom Read 문제가 발생할 수 있습니다.
- Repeatable Read (Level 2) : 트랜잭션 내의 삭제, 변경에 대해서 Undo 로그에 넣고 앞서 발생한 트랜잭션에 대해선 Undo 로그를 읽게 합니다. 트랜잭션 내에서의 값의 변경에 대해서 일정한 값으로 처리할 수 있습니다. 하지만 Phantom Read는 발생할 수 있습니다.
- Serializable Read (Level 3) : 트랜잭션 내에서 쿼리를 두 번 이상 수행 시 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지 않도록 하는 설정입니다.
※ 이런 트랜잭션 격리성을 너무 세게 잡는다면 성능적으로 안좋을 수 있지만 안정성이 올라가고 약하게 잡는다면 데이터의 일관성과 격리성이 떨어지게 되는 트레이드 오프가 있기에 잘 생각해서 사용해야합니다.
마무리
트랜잭션에 대해서 공부해봤습니다. 프로젝트를 진행하면서 트랜잭션을 많이 사용을 했는데 그 때마다 제대로 알지 못하고 썼던거 같습니다. 이번 기회에 개념을 잡을 수 있어서 좋았습니다.
Reference
https://sewonzzang.tistory.com/75
'몰랐던거 > DB' 카테고리의 다른 글
[Lock] DB 락에 대해서 공부하기 (0) | 2023.04.11 |
---|---|
인덱스 (index) (0) | 2022.11.30 |
DBMS의 종류, DB 서버 (0) | 2022.08.31 |
데이터베이스의 개념 (0) | 2022.08.31 |
DDL, DML, DCL 이란? (0) | 2022.08.25 |