코딩항해기

[리뷰/우아한테크] 로건의 Transaction 본문

IT tech

[리뷰/우아한테크] 로건의 Transaction

miniBcake 2024. 9. 18. 22:22

 

이번 중프(중간프로젝트) 때까지 트랜잭션을 적용하지 않아서 따로 영상을 찾아보았다.

전에 알고 있던 것보다 상식을 넓힐 수 있어 좋았다.

 

 

 

트랜잭션

트랜잭션의 정의

  • 여러 쿼리를 논리적으로 하나의 작업 단위로 묶는 것
  • 더 이상 나눌 수 없는 가장 작은 하나의 단위
  • 데이터베이스에서 수행되는 여러 작업을 하나의 논리적 단위로 수행하는 것

⇒ 하나의 작업단위로 수행

 

송금은 두 개의 update문으로 구성되어있다.

이 두 개를 트랜잭션으로 묶게되면 두 업데이트문이 오류 없이 성공적으로 마쳐졌을 때 DB에 반영되게 된다. 이를 commit이라고 한다.

그러나 오류가 발생하면 원래의 상태로 되돌아가게 되는데 이를 롤백이라고 한다.

이렇게 트랜잭션은 커밋과 롤백으로 이루어져있고 이는 트랜잭션 성질(ACID)의 원자성과 관련이 있다.

 

 

ACID (트랜잭션 성질)

트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질

Atomicity Consistency Isolation Durability

원자성 일관성 고립성 지속성

원자성 : 특정 트랜잭션의 안에 들어있는 모든 연산이 수행되거나 수행되지 말아야 한다.(All or Nothing)

일관성 : 데이터베이스 데이터 무결성 제약조건에 맞춰야한다.

고립성 : 어떤 트랜잭션에서 연산이 수행되면 다른 트랜잭션에 영향을 주거나 영향을 받아서는 안된다.

지속성 : 만약 어떤 트랜잭션이 성공적으로 수행됐다면 영구적으로 데이터베이스에 반영이 되어야한다는 것이다.

 

 

Isolation Level (트랜잭션 고립수준)

일관성을 지키기 위해서는 같은 데이터를 수정하는 트랜잭션이 있을 때 순차적으로 진행해야한다. 그런데 이는 성능상으로 단점이 된다. (시간이 오래 걸리게 된다)

따라서 현실적으로 어려운 점을 보완하기 위해 4가지 고립 수준을 소개하고 있다.

 

 

(속도가 빠르지만 데이터 일관성을 보장하지 못함)

 

READ-UNCOMMITTED : 아직 커밋되지 않은 데이터를 읽을 수 있다.

READ-COMMITTED : 커밋된 데이터만 읽을 수 있다.

REPEATABLE-READ : 특정 데이터를 반복 조회 시 같은 값을 반환한다.

SERIALIZABLE : 트랜잭션이 순차적으로 실행된다.

 

(속도가 느리지만 데이터 일관성을 보장함)

 

READ-UNCOMMITTED

아직 커밋되지 않은 데이터를 읽을 수 있다. 그렇기 때문에 중간에 문제가 일어나 롤백이 이뤄지면 롤백 전의 커밋되지 않은, 읽어간 데이터와 실제 DB간의 데이터가 차이나게 되는데 이러한 문제를 Dirty Read 문제라고 한다. 그 외에도 Non-Repeatable-Read 문제와 Phantom-Read문제를 가지고 있다.

 

Dirty Read
특정 트랜잭션에서 데이터를 변경했지만 아직 커밋되지 않았을 때, 다른 트랜잭션에서 해당 값을 조회할 수 있는 문제) 

 

 

READ-COMMITTED

커밋된 데이터만 읽을 수 있다. 커밋된 데이터만 읽을 수 있기 때문에 Drity Read문제는 해결되었지만 커밋 전 후로 같은 데이터를 읽어와도 다른 데이터가 나오는 문제가 발생하게 된다. 이를 Non-Repeatable-Read문제라고 한다.  그 외에도 Phantom-Read문제를 가지고 있다.

 

Non-Repeatable-Read
트랜잭션 내에서 같은 데이터를 여러 번 조회할 때 읽은 데이터가 서로 다른 값으로 나오는 문제

 

 

REPEATABLE-READ

특정 데이터를 반복 조회 시 같은 값을 반환한다. 커밋된 이후에도 이전 조회했던 데이터와 동일한 데이터를 넘겨준다. 따라서 Non-Repeatable-Read문제를 해결했다. 그러나 완벽하게 동일한 데이터가 나오는 것은 아니다. 특정 상황에서는 여전히 다른 데이터가 조회되는데, 이를 Phantom-Read 문제라고 한다.

 

Phantom-Read
Non-Repeatable-Read의 한 종류로 새로운 데이터가 생기거나, 기존의 데이터가 사라지는 문제

 

 

SERIALIZABLE

모든 문제가 해결된 상태로 고립성을 모두 만족하여 순차적으로 데이터를 처리한다. 커밋된 이후에 데이터를 읽어오는 트랜잭션이 순차적으로 실행되기 때문에 위의 문제들이 발생할 이유가 없다.

(속도가 느리므로 사용할 때 주의 요망)