Transaction
트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위라고 할 수 있습니다.
여기서 단위라고 하다 보니 정해진 범위가 있을 것 같지만 사용자가 정할 수 있는 범위입니다.
따라서 아래의 트랜잭션의 4가지 특징을 지키는 선 안에서 수행이 되어야 성공적인 트랜잭션의 사용법이라고 할 수 있습니다.
- 원자성 (Atomicity)
- 일관성 (Consistency)
- 독립성 (Isolation)
- 지속성 (Durability)
하지만 개발을 하다 보면 효율적인 성능을 위해 굳이 다른 트랜잭션에서 데이터 참조를 막을 필요가 없을 수도 있습니다.
아니면, 절대로 참조가 되면 안 되게 설정해야 할 필요가 있겠죠. 그래서 이러한 점을 개발자가 어느 정도는 설정을 해주면 좋겠습니다. 여기서 필요한 것이 Isolation Level입니다.
Isolation Level
Transaction Isolation Level은 아래와 같이 4가지 종류가 있습니다.
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
Read Uncommitted
- Commit 이전의 데이터는 다른 트랜잭션에서 접근할 수 있다.
- Insert, Update, Delete 후 Commit이나 Rollback에 상관없이 현재의 데이터를 읽는다.
- Lock이 발생하지 않는다.
- Dirty Read, Non-repeatable Read, Phantom Read 현상 발생 가능
Read Committed
- Oracle DBMS에서 Default로 사용하고 있는 Isolation Level
- Commit 이후의 데이터만 다른 트랜잭션에서 조회할 수 있다.
- 트랜잭션이 Commit이 안되어 있다면 다른 트랜잭션은 Undo 영역에 있는 기존 값을 참고하여 조회됨.
- Non-repeatable Read, Phantom Read 현상 발생 가능
Repeatable Read
- MySQL에서 Default로 사용하고 있는 Isolation Level
- InnoDB Storage Engine은 트랜잭션의 Rollback에 대비해 Undo 공간에 레코드를 백업해두고 실제 레코드 값을 변경
- 즉, 조회 시점에 Snapshot을 만들고 조회한다.
- 동일 트랜잭션 내에서 일관성을 보장
- record lock과 gap lock이 발생 가능
Serializable
- 가장 강한 Isolation Level
- Select 되는 모든 테이블에 Shared Lock이 발생
- 동시성이 필요한 DB에는 거의 사용하지 않음
정리
이러한 Isolation Level을 알아두고 필요할 시 설정을 해서 사용하면 좋을 것 같습니다. (거의 건드릴 만한 일이 없을 것 같지만..)
반응형
'기초 지식 > DB' 카테고리의 다른 글
[JPA] 낙관적 Lock, 비관적 Lock (1) | 2024.01.05 |
---|---|
[MyBatis] 마이바티스의 #{}, ${} 차이 (0) | 2021.08.26 |
DB의 결합 인덱스에 관해서 (0) | 2021.08.23 |
[MySQL] Insert 후 PK값 얻어오기 (MyBatis 사용) (0) | 2020.12.21 |
[Oracle] Partitioned index (0) | 2020.09.18 |