Free Lines Arrow
본문 바로가기
DataBase/DB 기초

[DB] 트랜잭션

by skahn1215 2021. 7. 21.
728x90
반응형

데이터베이스 트랜잭션

데이터 베이스 트랜잭션에 대해 공부해보자.

 

 

데이터베이스 트랜잭션(Database Transaction) 개념

  • 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.
  • 유사한 시스템이란?
    트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
  • 어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.
  • 쉽게 말하면 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위

 

 

 

특징

  • ACID 특징을 가진다
  • A: 원자성(Atomicity)
  • C: 일관성(Consistency)
  • I: 독립성(Isolation)
  • D: 영구성(Durability)

 

원자성 (Atomicity)?

  • 원자성은 하나의 원자 트랜잭션에 대해 모두 성공하거나 또는 모두 실패해야 된다.
  • 어떤건 실패하고 어떤건 성공해서는 안된다는 얘기다.
  • All or Nothing

  • ex)
    - 카카오톡에서 친구에게 돈을 보낼때 출금과 인출이 동시에 되어야 한다.
    - 출금만 되고 인출이 안되거나 인출만 되고 출금이 안되면 큰 문제이다.

 

일관성 (Consistency)?

  • SQL이 얼마나 수행이 됐든 DB의 상태가 동일하게 유지 되는 것을 얘기 한다.

  • ex)
    - DB 에서 돈의 타입이 정수 인데 sql 문을 실행하고 나면 돈의 타입이 string 으로 변경 되면 안된다는 얘기다.
    - 또는 최대 인출 금액이 100000 만원인데 그 이상의 값이 인출이 되면 안된다.

 

독립성(Isolation)?

  • 트랜잭션이 여러개 수행 될때 서로 간섭하면 안된다.

  • ex)
    - 1 번 2번 3번 4번 트랜잭션이 동시에 수행될때
    - 1 수행완료 -> 2수행완료 -> 3수행완료 -> 4 수행완료 이렇게 되어야 한다.

 

영구성(Durability)?

  • 성공적으로 트랜잭션이 수행 되었다면 그결과는 계속해서 유지 되어야 한다.

  • ex) 
    - 어떠한 상황에도 commit 된 데이터의 상태가 유지 되어야 한다.
    - OS 문제 등 여러가지 문제가 발생 했을때도 DB 안에있는 데이터는 유지가 되어야한다.

 

 

 

 

트랜잭션의 연산

  • Commit
    트랜잭션 처리가 정상적으로 되어 변경된 내용을 DB에 반영 하는 연산이다.

 

  • Roll-back
    트랜잭션이 수행 되는 도중 문제가 생기거나 문제가 생겨 일관성이 깨지면
    트랜잭션이 행한 모든 작업을 전부다 취소 하고 이전상태로 돌리는 연산이다.

 

  • Save point
    트랜잭션 중간에 save 포인트를 지정하는 연산이다.
    롤백을 할때 어디까지 롤백 할지 정할수 있다.

 

 

 

트랜잭션의 상태도

 

 

 

  • Active
    - 트랜잭션이 실행중인 상태
  • Partially Committed
    - 트랜잭션이 다 수행되었지만 commit 은 안된상태
  • Committed
    - 트랜잭션이 다 수행되어 정상적으로 commit 된 상태
  • Fail
    - 트랜잭션 실행중 오류가 발생하여 중단된 상태
  • Aborted
    - 트랜잭션이 비정상 적으로 종료되어 Roll back 된 상태

 

 

 

트랜잭션 격리 수준(Transaction Isolation Levels)

동시에 여러 Thread 별로 여러 트랜잭션이 진행될 때, 결과를 다른 트랜잭션에 어떻게 노출할지 결정한다.

 

  • READ UNCOMMITTED:
    - 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.

  • READ COMMITTED:
    - 커밋된 내용만 참조할 수 있다.

  • REPEATABLE READ:
    - 트랜잭션이 시작하기 전에 커밋된 내용만 참조할 수 있다.

  • SERIALIZABLE:
    - 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.

 

 

 

트랜잭션의 전파(Propagation)

  • 트랜잭션의 경계를 정의하며 시작 방법을 결정하는 속성이다.
  •  REQUIRED :  
    Defualt 속성이다. 
    트랜잭션의 시작 시점에 이미 진행중인 트랜잭션이 있으면  기존 트랜잭션에 참여하며 없을 경우 새로운 트랜잭션을 시작한다.

  •  REQUIRES_NEW: 
    항상 새로운 트랜잭션을 시작한다.   

  • SUPPORT : 
    이미 진행중인 트랜잭션이 있으면 참여하고, 없을 경우 Non-transaction으로 시작한다.
  • MANDATORY: 
    이미 진행중인 트랜잭션이 반드시 있어야만 해당 경계를 넘어 시작할 수 있다.  없을 경우 Exception을 발생시킨다.
  • NOT_SUPPORT:
    Non-transaction으로 시작하며, 이미 진행중인 트랜잭션이 있으면 잠시 보류시킨다.

  • NEVER:
    Non-transaction 상태에서만 해당 경계를 넘어갈 수 있다.  이미 진행중인 트랜잭션(parent)가 있으면 예외를 발생시킨다.  

  • NESTED:
    이미 진행중인 트랜잭션(parent)이 있을 경우 중첩트랜잭션을 생성하여 시작한다. 
    생성된 중첩트랜잭션은 (parent)가 rollback되면 함께 되지만, 해당 트랜잭션안에서의 Commit/Rollback은 (parent)에 영향을 주지 않는다. 
    이미 진행중인 트랜잭션이 없을 경우 새로운 트랜잭션을 만든다.

 

 

참고: https://ko.wikipedia.org/wik

 

728x90
반응형

'DataBase > DB 기초' 카테고리의 다른 글

[DB] Index 기본  (0) 2023.02.09
[DB] NoSQL  (0) 2021.08.19
[DB] Index 기초  (0) 2021.08.19
[DB] GROUP BY  (0) 2021.08.05
[DB] Join  (0) 2021.08.05

댓글