DB_Transaction

·2022년 7월 2일
0

데이터베이스

목록 보기
1/2

✏️트랜잭션(Transaction)이란?

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위
    • 상태 변화: SQL질의어를 통해 DB에 접근하는것

      ex)
      SELECT / INSERT / DELETE / UPDATE

    • 작업단위: 여러 SQL 명령문들을 사람이 정한 기준에 따른 단위

      ex) A가 B에게 만원을 송금한다.
      - DB 작업:
      사용자 A의 계좌에서 만원 차감: Update문 사용
      사용자 B의 계좌에 만원 추가: Update문 사용
      - 작업단위: 출금 Update문 + 입금 Update문
      =>두개의 DB작업을 통틀어 하나의 트랜잭션이라고 한다.
      두개의 작업이 모두 성공적으로 완료되어야 하나의 트랜잭션이 완료되는 것이고(Commit), 하나라도 실패한다면 모든 작업을 취소하고 작업 전 상태로 돌려놔야한다(Rollback)

✏️트랜잭션의 목적

  • 데이터 부정합 방지

    • DB서버에 여러개의 클라이언트가 동시에 엑세스 하는 경우
    • 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우
  • DB의 완전성(integrity) 유지 확인

    • DB가 수행한 일부 쿼리가 남지 않아야 한다
    • 트랜잭션은 서로 간섭하지 않아야 한다
  • 거래의 안전성 확보

    ex) A가 B에게 만원을 송금한다.

    1. A의 통장에서 만원을 차감한다.
    2. A의 통장에서 만원이 차감되었지만 B에게 입금 전 서버 오류가 발생
    3. B는 A로부터 만원을 받지 못함

✏️트랜잭션의 상태

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

트랜잭션의 연산

  • Commit : 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로 완료된 모든 내용을 데이터베이스에 영구적으로 저장하는 것
  • Rollback : 트랜잭션의 처리과정에서 발생한 변경사항들을 모두 취소하는 명령어로 트랜잭션이 시작하기 전의 상태로 되돌리는 것

✏️트랜잭션의 특징 : ACID

Atomicity : 원자성

  • 원자와 같이 트랜잭션을 더 이상 쪼갤 수 없는 단위라 생각하고 트랜잭션을 진행하며 모든 연산이 완전히 반영되거나 전혀 반형되지 않아야 함을 보장하는 특성
  • All or Nothing으로, 모든 연산들이 실패 없이 성공적으로 완료되면 Commit을 하고, 하나라도 실패하면 모든 연산들을 취소하고 트랜잭션 실행 바로 직전의 상태로 되돌리는 Rollback을 진행한다.

Consistency : 일관성

  • 트랜잭션이 성공적으로 실행 된 후에도 데이터베이스가 일관성 있는 상태를 가지고 있어야 함을 보장하는 특성
  • 변경된 데이터의 값이 정의된 제약조건이나 cascade, trigger에 맞게 변경되어야한다.

Isolation : 독립성

  • 둘 이상의 트랜잭션이 동시에 실행 될 때, 실행되는 각각의 트랜잭션이 서로의 연산에 끼어들 수 없어야 함을 보장하는 특성
  • Lock을 통해 독립성을 보장하고 있으며, 독립성을 통해 업데이트가 누락되거나, 데이터가 꼬이는 것을 방지한다.

Durability : 지속성

  • 트랜잭션이 성공적으로 완료 되었으면 해당 트랜잭션의 결과는 영구적으로 반영되어야 함을 보장하는 특성
  • 트랜잭션이 성공적으로 완료되어 Commit을 하려고 할 때 어떠한 이유로 DB의 서버가 강제종료 되어도 DB 서버가 다시 살아났을 때 완료된 데이터는 그대로 Commit이 되어야한다.

✏️트랜잭션 격리 수준

  • 트랜잭션 격리수준(Isolation level)이란 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타낸다.
  • 트랜잭션 격리 수준에 따라 데이터 조회의 결과가 달라질 수 있다. 트랜잭션 격리 수준에 따라 데이터 조회 결과가 달라지게 하는 기술을 MVCC(Multi Version Concurrency Consistency)라고 한다.

Lock : 트랜잭션의 순차성을 보장하기 위한 방법(동시성 제어)

  • 공유(shared) Lock: 데이터를 읽을 때 사용되는 Lock
    • 공유 락은 공유 락 끼리 동시 접근이 가능하다.
    • 공유 락이 설정된 데이터에 배타 락을 사용할 수는 없다.
  • 배타(Exclusive) Lock: 데이터를 변경하고자 할때 사용되며 트랜잭션이 완료될때 까지 유지된다.
    • 락이 해제될때까지 다른 트랜잭션은 해당 리소스에 접근할 수 없다.
    • 배타 락은 수행중인 데이터에 대해 접근해 함께 락을 설정할 수 없다.

READ UNCOMMITTED

커밋되지 않은 데이터에 접근할 수 있는 수준, N개의 트랜잭션이 하나의 공유 데이터에 접근해도 보호되지 않는다. 따라서 이 수준에서는 Dirty Read가 생긴다.

Drity Read

  • UPDATE 반영 전 데이터를 읽는 오류
  • INSERT 반영 전에 읽는 오류

READ COMMITTED

커밋된 데이터만 조회할 수 있다. 커밋된 데이터만 읽기 때문에 Dirty Read는 발생하지 않지만 Non-Repeatable Read 문제가 발생한다.

Non-Repeatable Read

  • 하나의 트랜잭션이 같은 값을 조회할 때 다른 값이 검색되는 오류

REPEATABLE READ

트랜잭션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회되는 격리수준이다. 트랜잭션 시작 전 커밋된 내용만을 조회하기 때문에
Non-Repeatable Read 오류가 발생하지 않는다.
이 수준은 Update에 대해서는 데이터 정합성을 보장하지만 Insert/Delete는 보장하지 않는다. 따라서 Phantom Read 문제가 발생한다.

Phantom Read

  • 데이터가 사라지거나 없던 데이터가 생기는 오류

SERIALIZABLE

트랜잭션이 특정 테이블을 읽으면 다른 트랜잭션은 그 테이블에 데이터를 추가/변경/삭제 할 수 없다.
가장 강력한 격리 수준이며 정합성을 가장 잘 보장하지만 동시 처리 성능이 가장 떨어진다.

profile
으쌰으쌰🐜🐜

0개의 댓글