트랜잭션 Transaction

조윤호·2023년 9월 4일
0

Database

목록 보기
2/2

데이터베이스에서 가장 중요한 개념 중 하나인 Transaction과 DB 격리수준에 대해 알아보자

Transaction

Transaction이란 하나의 논리적인 작업 단위를 말한다.
사용자의 입장에서는 하나의 작업이지만, DB에서는 여러 작업이 순서대로 일어나야만 하는 경우가 있다.
가장 대표적인 예로, 통장 입출금을 예로 들 수 있다.

  • 논리적 작업
    • 1000원이 들어있는 통장에 200원을 입금한다.
  • 실제 작업
    1. 데이터베이스에서 통장 잔고를 조회한다.
    2. 통장 잔고 + 200
    3. 결과 잔고를 데이터베이스에 기록한다.

이렇게 세 개의 다른 DB 작업을 하나의 작업으로 묶어 나눠지 않도록 하기 위한 개념이 트랜잭션이다.

## case 1
START TRANSACTION;        ## 트랜잭션 시작
UPDATE xxx SET xxx ... ;  ## SQL 1
UPDATE xxx SET xxx ... ;  ## SQL 2
... ;
COMMIT;                   ## 지금까지의 작업 내용을 DB에 영구적으로 저장 and transaction 종료


## case 2
START TRANSACTION;        ## 트랜잭션 시작
UPDATE xxx SET xxx ... ;  ## SQL
... ;
ROLLBACK;                 ## 지금까지의 작업 모두 취소, transaction 이전으로 되돌린다.
  • case 1 : COMMIT 과 함께 모든 변경사항 저장
  • case 2 : ROLLBACK에 의해 모든 변경사항 취소

AUTOCOMMIT

  • SELECT @@AUTOCOMMIT;
  • 각각의 SQL문을 자동으로 transaction 처리. SQL 처리된 이후에 자동으로 commit한다(==rollback 이 불가능하다).
  • TRANSACTION 상태에서는 AUTOCOMMIT off -> 이후 commit/rollback 되면 다시 AUTOCOMMIT on으로 전환된다.

코드에서 트랜잭션 처리

  1. 기본 버전
public void transfer(){
  try {
    Connection connection = ...;
    connection.setAutoCommit(false);
    ...                                 // 데이터 수정
    ...                                 // 데이터 수정
    connection.commit();
  }catch (Exception e){
    ...
    connection.rollback();
  } finally {
    connection.setAutoCommit(true);
  }
}
  • "데이터 수정" 라인 외에는 모두 동일한 로직 -> AOP로 처리한다! -> @Tansactional
  1. Spring @Transactional
@Transactional
public void transfer(){
  ...                                 // 데이터 수정
  ...                                 // 데이터 수정
}
  • 코드가 간결해졌다!

ACID

  • Atomicity
  • Consistency
  • Isolation
  • Durability

Atomicity (원자성)

  • 내부 작업은 "하나의 단위"로 처리되어야 한다.

    • Transaction은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다.
  • 모두 성공 or 모두 실패

  • ex )

    • A(잔고 30) 가 B(잔고 50) 에게 20원 이체하는 작업 중 일부 작업에서 예외 발생 -> 모든 작업 rollback

Consistency (일관성)

  • transaction은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.

  • 작업 결과가 DB에 정의된 규칙을 위반한다면 rollback 해야 한다.

  • DBMS는 commit 전에 rule을 위반했는지 여부를 확인한다.

  • ex )

    • A(잔고 30) 가 B(잔고 50) 에게 20원 이체 -> A(잔고 10), B(잔고 70) 이므로 rule 통과
    • A(잔고 10) 가 B(잔고 70) 에게 20원 이체 -> A(잔고 -10), B(잔고 90) 이므로 rule 위반 -> 예외 반환

Isolation (격리성)

  • 여러 transaction이 동시에 실행되는 경우에도 각각 실행되는 것 처럼 동작되어야 한다.

  • DBMS의 transaction isolation level -> 뒤에 다시 나옴!

    • 높을수록 정확도 good / 성능 bad
  • ex )

    • A(잔고 30) 가 B(잔고 50) 에게 20원 이체하는 동시에,
    • B가 자신의 계좌에 30원 입금

Durability (영존성)

  • commit 된 transaction은 db에 영구적으로 저장된다.
  • DB에 문제가 발생해도 transaction은 db에 반영되어있다.

트랜잭션 격리 수준

  • READ UNCOMMITTED
    • 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있음
    • 팬텀 리드, 논 리피터블 리드, 더티 리드 발생 가능
    • 더티 리드
      • 읽는 도중에 rollback 발생시 -> 존재하지 않는 데이터를 읽어올 수 있다.
  • READ COMMITTED : Default
    • 커밋된 데이터만 읽을 수 있음
    • 팬텀 리드, 논 리피터블 리드 발생 가능
    • 논 리피터블 리드
      • 읽는 도중에 수정이 발생할 수 있다.
  • REPEATABLE READ
    • 하나의 트랜잭션이 읽은 데이터는 다른 트랜잭션에서 수정 불가능
    • 팬텀 리드 발생 가능
    • 팬텀 리드
      • 읽는 도중에 create가 발생하여 새로운 row가 생성될 수 있다.
  • SERIALIZABLE
    • 한 테이블에 여러 트랜잭션이 동시에 접근할 수 없음
    • 순차적으로 트랜잭션을 수행하는것과 같다.
profile
한걸음씩 성실히

0개의 댓글