트랜잭션이란?
여러 쿼리를 논리적으로 하나의 작업으로 묶어 주는 것
트랜잭션의 4가지 특징 : ACID
Atomicity : 원자성
한 트랜잭션의 연산이 모두 성공하거나(commit), 모두 실패해야한다 (rollback)
Consistency : 일관성
한 트랜잭션 이전과 이후의 데이터베이스 상태가 유효해야한다
즉, 데이터베이스의 제약이나 규칙을 만족해야한다
Isolation : 독립성
모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야한다
둘 이상의 트랜잭션이 동시 실행되고 있을 때 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다
durability : 지속성
한 트랜잭션이 성공적으로 수행되었다면 결과는 영구히 반영되어야 한다
트랜잭션이 동시 접근 시 발생되는 현상
Dirty Write : 커밋되지 않은 데이터 덮어쓰기
같은 데이터에 대해 동시에 두개 이상의 트랜잭션이 값을 바꾸고자 하는 현상
Dirty Read : 커밋되지 않은 데이터 읽기
아직 종료되지 않은 트랜잭션의 내용을 읽는 것, 비정상적 상태의 데이터를 읽게 되는 현상
Non-repeatable Read
어떤 트랜잭션에서 동일한 데이터의 값을 매번 읽을 때 마다 달라지는 현상
Phantom Read
기존 데이터는 동일한데 새로 추가된(insert, delete) 값에 의해 데이터 값이 변경되는 현상
트랜잭션 격리 수준
동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정
Read-Uncommitted
커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용한다
이 레벨에서는 dirty read, non-repeatable read, phantom read의 다양한 문제가 발생해서 사실상 사용하지 않는다
Read-Commited
커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
- 커밋된 데이터만 읽기
- 커밋된 값과 트랜잭션 진행 중인 값을 따로 보관
- 커밋된 데이터만 덮어쓰기
- 행 단위 잠금을 사용
이 레벨에서는 non-repeatable read, phantom read의 문제가 발생한다
오라클 default 설정이다
Repeatable-Read
트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장
읽는 시점에 특정 버전에 해당하는 데이터만 읽도록 함
Serializable
한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근 불가
트랜잭션의 ACID 성질을 엄격히 지키나, 성능은 가장 떨어진다
단순 select 만으로도 트랜잭션이 commit 될때까지 모든 데이터에 잠금이 설정되어 다른 트랜잭션에서 해당 데이터를 변경할 수 없다
따라서 실제로는 인덱스 잠금이나 조건 기반 잠금 등으로 사용한다
- reference
https://velog.io/@guswns3371/데이터베이스-트랜잭션-격리수준
https://www.youtube.com/watch?v=e9PC0sroCzc
https://www.youtube.com/watch?v=urpF7jwVNWs&list=PLwouWTPuIjUg0dmHoxgqNXyx3Acy7BNCz&index=5
'CS > DB' 카테고리의 다른 글
[DB] Index with B-Tree (0) | 2021.06.28 |
---|---|
[DB] Index 란? (0) | 2021.06.28 |