티스토리 뷰

트랜잭션이란?

트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위.

또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.

데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위로 Commit 되거나 Rollback 되어야 합니다.

트랜잭션을 쓰는 이유는 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위해서죠.

 

 

트랜잭션 특성 (ACID)

트랜잭션은 아래 4가지 특성을 가집니다.

 

 

Atomicity(원자성)
트랜잭션의 연산은 DB에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 합니다.

 


Consistency(일관성)
트랜잭션 실행을 성공적으로 완료하면 언제나 일관성 있는 DB 상태를 유지하는 것.
일관성을 깨는 데이터에 대해서는 트랜잭션이 성공적으로 실행되지 않아야 한다는 의미입니다.

 


Isolation(독립성)
각각의 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다.
하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.


isolation 성질을 보장할 수 있는 가장 쉬운 방법은 모든 트랜잭션을 순차적으로 수행하는 것이지만 이는 성능을 매우 저하키겠죠.

따라서 여러 DBMS는 격리성의 수준을 여러 단계로 나눠놓고 사용자가 선택해 사용할 수 있도록 지원합니다.⭐

 


지속성 ( Durability )
성공적으로 수행된 트랜잭션은 영원히 반영된다.
트랜잭션이 성공했다면, 데이터베이스에 어떤 시스템적인 문제가 발생하더라도 데이터는 영구적으로 보존되어야 한다는 특성입니다.

 

 


⭐MySQL의 트랜잭션 격리 수준(Isolation Level)

MySQL은 아래 4단계의 트랜잭션 격리 수준을 지원합니다.

아래로 갈수록 격리 레벨이 높아집니다!

 

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

 

 

1. READ UNCOMMITTED

커밋하지 않은 데이터조차도 접근할 수 있는 격리 수준. 

 

트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 Dirty Read(오손 읽기)가 발생합니다.

예를 들어 문제가 생겨 INSERT 한 데이터를 ROLLBACK 할지도 모르는 상태인데도 해당 레코드 조회가 가능합니다...!

 

당연하게도 심각한 정합성 문제가 발생하기 때문에 일반적으로 사용하지 않습니다.

 

 

2. READ COMMITTED

커밋이 완료된 데이터만 조회.

다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지는 Non-Repeatable Read(반복 읽기 불가능)이 발생한다.

 

예를 들어 트랜잭션 A와 B가 있다고 해보자.

먼저 트랜잭션 A가 시작되었다. A는 특정 레코드를 조회하고 a라는 결과를 받았다. 

그리고 트랜잭션 A가 종료되기 전, 트랜잭션 B가 실행되었고 레코드의 값을 b로 바꾼 뒤 종료되었다.

이때 트랜잭션 A가 다시 레코드를 조회하면 b라는 결과를 받게 된다.

 

 Non-Repeatable Read(반복 읽기 불가능)란

트랜잭션 내에서는 시작할 당시의 정보를 유지(Repeatable Read : SELECT 쿼리는 동일한 결과를 리턴)해야 하는데,  

READ COMMITTED 에서는 이를 보장하지 못한다는 겁니다. 

 

READ COMMITTED 는 Oracle에서 기본 수준으로 채택하고 있습니다.

(Lock을 사용하지 않고 쿼리시작 시점의 Undo 데이터를 제공하는 방식으로 구현)

 

 

 

3. REPEATABLE READ

한번 조회한 데이터는 트랜잭션 내에서 다시 조회해도 같은 데이터가 나오는 게 보장.


하지만 새로운 레코드의 추가 자체를 막는 것이 아니기에 Phantom Read(유령 읽기 : 결과 집합이 변함)가 발생할 수 있습니다.

MySQL, InnoDB에서 기본 수준으로 채택하고 있습니다.

 

 

Dirty Read와 Phantom Read의 차이?

  • Dirty Read : 더티 리드는 트랜잭션으로 아직 존재할 수 없는 데이터가 조회되는 것을 말한다.
  • Phantom Read : 존재할 수 있는 데이터긴 하나 해당 트랜잭션의 시점이 아닌 것을 말한다

 

 

4. SERIALIZABLE

모든 트랜잭션을 순차적으로 처리. 때문에 동시 처리 성능이 매우 떨어진다.

여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로 어떠한 데이터 부정합 문제도 발생하지 않습니다.


순수한 SELECT 작업도 대상 레코드에 Next Key Lock을 읽기 잠금으로 걸기 때문에
해당 레코드를 다른 트랜잭션에서는 절대 추가/수정/삭제할 수 없도록 합니다.

 

 

 


 

 

 

MySQL 트랜잭션 명령어


앞서 언급했다 싶이, MySQL의 기본 격리수준은 REPEATABLE-READ입니다.
아래 명령어로 현재 격리수준을 확인할 수 있습니다.

SELECT @@GLOBAL.transaction_isolation;
SELECT @@SESSION.transaction_isolation;

 

 


격리수준을 변경하려면 아래 명령어를 입력하면 됩니다.

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

 

 

 

감사합니다. 

 


공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

'DB' 카테고리의 다른 글

[DB] SQL의 기본 문법  (0) 2024.03.04
[DB] NoSQL과 레디스(Redis)  (0) 2023.12.07
[DB] ORM(Object Relational Mapping)이란, 객체-관계 불일치  (0) 2023.10.31
[DB] MySQL 설치하기  (0) 2022.02.03
[DB]SQL Injection 이란?  (0) 2022.01.28
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday