본문 바로가기
카테고리 없음

[ DataBase ] 트랜잭션 Transaction

by ウリ김영은 2024. 1. 16.

트랜잭션 Transaction 

✔️트랜잭션이란?

 

데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 구성하는 일련의 연산들의 집합을 의미한다. 

(데이터 베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말합니다. )

 

SQL 쿼리(SELECT, UPDATE, INSERT, DELETE와 같은 연산)을 수행하며 데이터베이스의 상태를 변화시킨다.



✔️트랜잭션의 목적

 

사용자가 데이터베이스의 무결성(Integrity) 유지를 확신하게 해준다. (보장해준다.)



✔️트랜잭션의 특징 - ACID

 

  1. Atomicity 원자성

 

  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 한다.(부분적으로 실행되거나 중단되지 않는것을 보장)
  • 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소된다. 
  • 모두 실패해서 Rollback 되거나,  모두 성공해서 Commit 이 된다.(all or nothing)
  • 트랜잭션 전파

 

  1. Consistency 일관성 : 허용된 방식으로만 데이터를 변경해야 하는 것

 

  • 트랜잭션의 작업 처리 결과는 항상 일관성을 유지해야 한다.
  • 데이터베이스에서 정한 무결성 제약 조건을 만족해야 한다.

 

  1. Isolation 격리성, 독립성

 

  • 트랜잭션 수행 시 서로 끼어들지 못하는 것
  • 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 합니다. 
  • 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션의 수행 결과를 참조할 수 없다.
  • 트랜잭션 격리 수준을 선택할 수 있다. => 격리성 보장

 

  1. Durability 지속성

 

  • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도 영구적으로 반영되어야 한다. 

(중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구할 수 있다.) 



✔️트랜잭션의 상태

  • Active 활동 : 트랜잭션이 실행 중인 상태
  • Failed 실패 : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • Aborted 취소 : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
  • Partially Committed 부분완료 : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
  • Committed 완료 : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

 

✔️트랜잭션의 기능

=> 데이터의 무결성이 보장됩니다. 또한, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있습니다. 

 

Commit : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어; 트랜잭션 단위로 수행되며 변경된  내용이 모두 영구적으로 저장되는 것을 말합니다. 

  • 커밋이 수행되었다 === 하나의 트랜잭션이 성공적으로 수행되었다. 
  • 하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성 있는 상태에 있음을 의미하는 연산이다.
  • commit을 호출하기 전까지는 이전 데이터가 임시로 저장되어 있기 때문에, 해당 트랜잭션을 시작한 세션(사용자)에게만 변경 데이터가 보이고, 다른 세션에게는 보이지 않습니다.

Rollback: 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)을 말합니다. 

  • 하나의 트랜잭션 처리가 실패돼서 트랜잭션의 원자성이 깨진 상태를 의미하는 연산이다.
  • 원자성을 지키기 위해 실행한 모든 연산을 취소(Undo)해야한다.

트랜잭션 전파란? 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것

✔️ 요약

 — 

 

➕트랜잭션 격리 수준 Isolation Level

트랜잭션 격리 수준이란?

 

트랜잭션들끼리 일관성 있는 데이터를 얼마나 허용할 것인지 정해놓은 수준이다. 

 

격리 수준에 따라 발생하는 현상

 

  • Dirty Read : 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말합니다. 

 

  • Non Repeatable Read : 어떤 트랜잭션이 같은 쿼리를 2번 실행하는데 ( 그 사이에 다른 트랜잭션이 수정/삭제를 하여) 같은 쿼리에 다른 값이 나오는 경우

 

  • Phantom Read :한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우



트랜잭션 격리 수준의 종류 => 레벨 올라갈수록 격리성 강해진다. 동시성 약해진다. 

  • READ uncommitted (LEVEL 0) => 팬텀리드, 반복 가능하지 않은 조회, 더티 리드 발생
  • READ committed (LEVEL 1) => 팬텀 리드, 반복 가능하지 않은 조회 발생
  • REPEATABLE READ (LEVEL 2) => 팬텀리드 발생
  • SERIALIZABLE (LEVEL 3)

 

➕ 트랜잭션 전파

여러 트랙잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 말합니다. 

Spring 프레임워크에서는  @Transactional annotation을 통해 여러 쿼리 관련 코드들을 트랜잭션으로 처리합니다.