본문 바로가기

CS/DB

DB 트랜잭션 & 트랜잭션 격리수준

반응형

트랜잭션이란?

여러 쿼리를 논리적으로 하나의 작업으로 묶어 주는 것

트랜잭션의 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://wonit.tistory.com/462

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