DB/Transaction

[DB] 트랜잭션 및 트랜잭션의 격리 수준

JUN0126 2022. 6. 21. 00:22

많은 데이터를 다루고 싶어 했던 내가 막상 트랜잭션의 원리만 이해하고 더 깊게 파보지 못했던 트랜잭션의 격리 수준을 공부하거나 생각해본 경험이 없기에 이러한 용어들을 알게 되어 글을 작성하게 되었습니다...

 

우선 트랜잭션이라는 용어 및 의미를 다시 한 번 정의 해보겠습니다.

 

트랜잭션이란?

 - DBMS에서 데이터를 다루는 논리적인 작업의 단위

 - 데이터의 정합성을 보장하기 위한 기능

 - 트랜잭션 작업은 전체가 수행되거나, 전혀 수행되지 않아야 한다 (ALL or NOTHING)

 

트랜잭션의 특징 (ACID)

1. 원자성 (Automicity)

  - 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나, 혹은 모두 실패해야한다.

 

2. 일관성 (Consistency)

  - 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야한다.

  - 동시성 제어 알고리즘, 무결성 제약 조건 활용 

   EX) 테이블의 기본키와 같은 속성은 유지 되어야한다는것, 두 계좌에서 입출금이 일어났을 경우 두 계좌의 총 합은 같아야 한다는것

 

3. 격리성 (Isolation, 고립성)

 - 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.

 - 상호간의 존재를 모르고 독립적으로 수행 되어야 한다는것

 - 동시에 같은 데이터를 수정하지 못하도록 해야 한다.

 

4. 지속성 (Durability)

 - 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록 되어야 한다.

 - 중간에 문제가 생기더라도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다. 

 

 

여러 사용자가 데이터를 다루는데 있어서 한 사용자의 데이터 처리가 다뤄지는 과정에서 다른 사용자가 데이터 처리 요청을 했을 경우 

격리성 (고립성) 이 지켜지지 않으면 1개의 트랜잭션은 쓰기, 1개의 트랜잭션은 읽는 경우 오손읽기, 반복 불가능 읽기, 유령데이터 읽기 2개 트랜잭션이 모드 쓰기 일 경우 갱신 손실, 모순성, 연쇄 복귀 등 문제 발생 야기 // 문제 발생 내역을 상세하기 정리 해볼 필요가 있다

단순 읽기만을 이용하는 데이터 조회 방식에는 동시성을 제어 할 필요가 없다, 아무런 문제도 발생시키지 않기 때문

 

트랜잭션간에 격리성을 완벽히 보장 하려면 동시에 처리되는 트랜잭션을 거의 차례대로 실행해야 한다.

하지만 이렇게 처리를 하면 처리 성능이 매우 나빠지게 된다. 이러한 문제로 인해 트랜잭션을 4단계로 격리수준을 나누어

정의하여 동시에 여러 트랜잭션이 처리될 떄, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록

허용할지 말지를 결정하는것이 트랜잭션 격리 수준입니다.

 

MySQL 격리수준

1. 커밋되지 않은 읽기 (READ UNCOMMITTED)  격리수준 낮음, 동시성 문제를 야기할 수 있다. 

2. 커밋된 읽기 (READ COMMITTED)

3. 반복 가능한 읽기 (REPEATABLE READ)

4. SERIALIZABLE (직렬화)  격리수준 높음

 

격리수준이 높아질 수록 동시에 실행되는 트랜잭션들이 완전히 동기적으로 이루어 짐으로 성능이 하향될 수 있다.

하지만 격리수준이 너무 낮다면 트랜잭션 처리 작업 중 다른 트랜잭션이 겹칠 확률이 있어 문제를 야기 할 확률이 높다.

 

회복  (Recovery)

 - 데이터베이스를 장애가 발생했던 이전의 상태로 복구시켜서 일관된 데이터베이스 상태를 유지하도록 하는것

 

 

 

단순한 트랜잭션의 개념을 아는것도 중요하지만 데이터가 변경되고 다뤄지는 트랜잭션 환경에서 어떻게 데이터들이 문제 없이 흘러가고

오류가 발생했을때 어떻게 처리하고 어떤 오류가 있는지 파악하여 더 추가적으로 정리를 해야겠다..

 

 

 

참고 :

https://mangkyu.tistory.com/30

https://zzang9ha.tistory.com/381