[TIL_2023.12.01] 트랜잭션(Transaction)

김효진·2023년 12월 1일
0
post-custom-banner
  1. 트랜잭션(Transaction)이란?

    트랜잭션은 은행 ATM이나 데이터베이스 등의 시스템에서 사용되는 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.
    예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고, 오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다.

  2. 트랜잭션 효과
    트랜잭션(Transaction)을 이용한다면 사용자가 항상 어플리케이션 실행을 완료하도록 구성할 수 있게되고, 실행을 중단할 만한 치명적인 오류가 발생하더라도, DB에 피해가 가지않아 더욱 안전하게 어플리케이션을 구성할 수 있게 된다.

  3. 트랜잭션의 특징 : ACID

    원자성(Atomicity) / 일관성(Consistency) / 격리성(Isolation) / 지속성(Durability)

    1) 원자성(Atomicity) : 트랜잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리하여, 내부에서 실행된 명령들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징

    2) 일관성(Consistency) : 트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야하는 특징입니다. 만약 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않는 특징

    -> 한 트랜잭션의 작업이 정상처리가 됬다면 commit하여 작업완료 및 DB업데이트를 진행하고, 중간에 오류가 생겨 일부 성공하고 나머지 실패했다면 rollback을 통해 데이터베이스를 원복함.

    3) 격리성(Isolation) : 트랜잭션이 실행 중인 경우 다른 트랜잭션에 의해 데이터가 변경되는 것을 방지하는 특징입니다. 트랜잭션이 완전히 수행되거나 완전히 수행되지 않은 상태를 외부에서 참조할 수는 있지만, 트랜잭션의 중간 과정이나 중간 결과를 볼 수 없도록 하는 특징

    4) 지속성(Durability) : 트랜잭션이 성공적으로 커밋된 후, 해당 트랜잭션에 의해 생성 또는 수정된 데이터가 어떠한 상황에서도 보존되는 특징으로 트랜잭션이 완료되면 결과는 데이터베이스에 영구적으로 저장되며, 이후 시스템에 어떠한 문제가 생기더라도 데이터는 손상되지 않음

    -> 성공적으로 완료되면, 해당 트랜잭션에 의해 생성 또는 변경된 데이터는 데이터베이스에 COMMIT 명령을 통해 영구적으로 저장되며 트랜잭션 수행 도중 시스템이 비정상 종료되더라도, 시스템은 트랜잭션 로그(Transaction Log)를 통해 아직 커밋되지 않은 트랜잭션을 복구할 수 있다.

  4. 락(Lock)

    1) 종류

    • 공유 락(Shared Locks) | 읽기 락(READ Locks)
      다른 트랜잭션이 데이터를 읽는 것은 허용하지만, 수정하는 것을 금지, READ 전용 락이라고 불리기도 하며, 해당 락을 사용하는 트랜잭션이 모든 작업을 수행하였다면 공유 락은 해제됨.
    • 배타 락(Exclusive Locks) | 쓰기 락(WRITE Locks)
      다른 트랜잭션이 데이터를 읽거나, 수정하는 것을 금지, WRITE 전용 락이라고 불리며, 트랜잭션이 해당하는 데이터를 점유한 후 다른 트랜잭션이 해당 데이터에 접근 할 수 없도록 함

    2) 락킹 수준(Locking Level)

    • 글로벌 락(Global Locks) | 데이터베이스 락(Database Locks)
      데이터베이스의 모든 테이블에 락을 걸어, 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 함. 가장 높은 수준의 락, 가장 큰 범위
    • 테이블 락(Table Locks)
      다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 함
    • 네임드 락(Named Locks)
      테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열을 점유
    • 메타데이터 락(Metadata Locks)
      다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 함

    ** 락은 다양한 락킹 수준(Locking Level)을 가지고 있는데, 잘못된 락 설정을 하게 될 경우 여러분들은 모든 API가 동작하지 않는 교착 상태(Dead Lock)가 발생하게 되어, 프로그램이 멈춰버리는 문제가 발생하게 될 수 있으니 트랜잭션에서 사용하는 락(Lock)의 수준을 명확하게 이해하고, 적재적소에 필요한 락의 수준을 설정하여 트랜잭션을 구성해야 함.

  5. 트랜잭션의 격리 수준 (Isolation Level)
    여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용하거나 거부하는 것을 결정하기 위해 사용하는 것
    -> 중요한 점은 ‘데이터의 일관성’과 ‘동시성 처리 성능’ 사이에서 균형을 잡는 것

    1) READ UNCOMMITTED

    • 커밋 되지 않은 읽기(Uncommitted Read)를 허용하는 격리 수준
    • 가장 낮은 수준의 격리수준이며, 락을 걸지 않아 동시성이 높지만 일관성이 쉽게 깨질 수 있음
    •  커밋되지 않은 읽기(Uncommitted Read)란? 다른 트랜잭션에 의해 작업중인 데이터를 읽게 되는 것을 나타냅니다. 만약 커밋되지 않은 읽기가 발생할 경우, 의도치 않은 데이터를 참조하게 되어 데이터의 일관성이 깨지게 되는 상황

    2) READ COMMITTED

    • 커밋 된 읽기(Committed Read)만을 허용하고, 'SELECT' 문을 실행할 때 공유락을 검
    • 다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없어 커밋되지 않은 읽기현상이 발생하지 않음

    3) REPEATABLE READ

    • 읽기를 마치더라도 공유락풀지 않으며, 트랜잭션이 완전히 종료될 때 까지 락을 유지.
    • 공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입하는 것이 가능. 그로인해 팬텀 읽기가 발생할 수 있는 문제점이 있음.
    • 팬텀 읽기(Phantom Read)란? 트랜잭션을 수행하던 중 다른 트랜잭션에 의해 삭제된 데이터를 팬텀행(Phantom Rows)이라고 하며, 팬텀행에 해당하는 데이터를 읽는 것이 팬텀 읽기임.

    4) SERIALIZABLE

    • 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 새로운 데이터를 추가하는 것 또한 불가능합니다.
    • 가장 높은 수준의 격리 수준이므로, 동시성이 떨어지는 문제점이 존재합니다.
profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!
post-custom-banner

0개의 댓글