항해 주특기 심화주차 - 트랜잭션

youngsung·2023년 3월 10일
0

Node.js

목록 보기
3/7

트랜잭션(Transaction) (1)

  1. 트랜잭션(Transaction)이란 무엇인가?

    트랜잭션은 작업의 완전성을 보장해주기 위해 사용되는 개념입니다. 특정한 작업을 전부 처리하거나, 전부 실패하게 만들어 데이터의 일관성을 보장해주는 기능입니다.

트랜잭션(Transaction)을 사용하는 이유는 작업의 단위를 하나의 쿼리에 종속하는 것이 아니라, 여러개의 작업(쿼리)을 묶어 하나의 작업 단위로 그룹화하여 처리하는 작업을 말합니다. 대부분의 데이터베이스가 트랜잭션의 특징을 이용하고 있습니다.

  1. 트랜잭션을 사용하는 이유?
    부분 업데이트(Partial Update)와 같은 상황을 방지하기 위해 트랜잭션(Transaction)이라는 개념을 사용하게 되었습니다.
    내용을 저장하는 로깅작업, 영화관의 예매 시스템, 은행의 결제 시스템등 데이터의 일관성을 유지해야하는 상황에서 사용하게 됩니다.

    결국 트랜잭션을 이용한다면 사용자가 항상 프로그램 실행을 완료하도록 구성하고, 만약 실행을 중단할 만한 치명적인 오류가 발생하더라도, DB에 피해가 가지않아 더욱 안전하게 구성할 수 있게 됩니다.

  2. 트랜잭션의 대표적인 4가지 특징 (ACID)

  • ACID는 트랜잭션을 이용하여 데이터베이스를 더욱 안전하게 구성할 수 있게 도와주는 트랜잭션 특징입니다.

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

    1) 원자성(Atomicity)
    원자성은 트랜잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리하여, 내부에서실행된 명령어들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징입니다.
    2) 일관성(Consistency)
    일관성은 트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야하는 특징입니다. 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않는 특징입니다. 중간 데이터를 보내는 도중 문제가 발생했더라면, 시작할 때 데이터 상태이거나 아니면 종료 전부 다 완료 되었을 때에 대한 데이터 상태이거나 둘중 하나여야 합니다.
    3) 격리성(Isolation)
    격리성은 트랜잭션의 경우 실행 전이나 실행 후의 데이터를 외부에서 참조할 수 있지만, 트랜잭션을 수행하는 중간 상태를 보거나 변경할 수 없도록 구성하는 특징입니다.
    MySQL에서는 사용중인 DB오브젝트에 락(Lock)을 걸어 격리성을 구현하게 됩니다.
    락을 건 상태는 DB에 접속한 또다른 클라이언트가 해당하는 DB 오브젝트를 읽거나, 사용할 수 없도록 만든다는 개념입니다.
    격리성에서는 동시성(Concurrency)과 격리 수준(Isolation Level)라는 개념이 나타나게 되었습니다.

    • 동시성(Concurrency)이란?
      동시성은 여러명의 클라이언트가 하나의 데이터를 도이셍 사용및 공유 하는 것을 뜻합니다.

    4) 지속성(Durability)
    지속성은 트랜잭션을 성공적으로 수행하면 수정된 데이터를 시스템에 영구적으로 적용하는 특징입니다. 트랜잭션의 중간 결과가 아니라 완성된 결과만 저장하여 데이터베이스에 이상이 생기더라도 자동 복구할 수 있는 특성을 가지고 있습니다.

트랜잭션(Transaction) (2)

1) MySQL에서의 트랜잭션

-- 트랜잭션을 시작합니다
START TRANSACTION;

-- 성공시 작업 내역을 DB에 반영합니다.
COMMIT;

-- 실패시 START TRANSACTION이 실행되기 전 상태로 작업 내역을 취소합니다.
ROLLBACK;

2) 락(Lock)
락은 동시성을 제어하기 위해 사용하는 기능입니다. 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위해 사용합니다.
하나의 데이터를 여러 사용자들이 동시에 변경하려고 할 때, 락이 존재하지 않는다면, 한번에 여러번의 수정이 발생하게되고, 최종 수정된 결과값을 인지할 수 없게 되는 상황으로 인해 데이터베이스의 일관성이 깨지게 됩니다. 이런 상황을 방지하기 위해 데이터베이스에서는 락(Lock)이라는 기능을 지원하게 되었습니다.

3) 락(Lock)의 종류

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

4) 락킹 수준(Locking Level)

  • 글로벌 락(Global Locks) | 데이터베이스 락(Database Locks)

    • 데이터베이스의 모든 테이블에 락을 걸어, 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 만듭니다.
    • 가장 높은 수준의 락을 가지고 있으며, 가장 큰 범위를 가지고 있습니다.
  • 테이블 락(Table Locks)

    • 다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 합니다.
  • 네임드 락(Named Locks)

    • 테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열을 점유합니다.
  • 메타데이터 락(Metadata Locks)

    • 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 합니다.

5) 트랜잭션의 격리 수준 (Isolation Level)
트랜잭션의 격리수준은 여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용하거나 거부하는 것을 결정하기 위해 사용하는 것 입니다.
트랜잭션의 격리 수준은 대표적으로 4가지로 나타냅니다.

  • READ UNCOMMITTED
    • 커밋 되지 않은 읽기(Uncommitted Read)를 허용하는 격리 수준
    • 가장 낮은 수준의 격리수준이며, 락을 걸지 않아 동시성이 높지만 일관성이 쉽게 깨질 수 있습니다.
  • READ COMMITTED
    • 커밋 된 읽기(Committed Read)만을 허용하고, Select문을 실행할 때 공유락을 겁니다.
    • 다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없어 커밋되지 않은 읽기현상이 발생하지 않습니다.
  • REPETEABLE READ
    • 읽기를 마치더라도 공유락을 풀지 않으며, 트랜잭션이 완전히 종료될 때 까지 락을 유지합니다.
    • 공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입하는 것이 가능해집니다. 그로인해 팬텀 읽기가 발생할 수 있는 문제점이 있습니다.
  • SERIALIZABLE
    • 데이터를 읽는 동안 다른 트랜잭션이 해당 ㄴ데이터를 읽거나 삽입할 수 없고, 새로운 데이터를 추가하는 것 또한 불가능합니다.
    • 가장 높은 수준의 격리 수준이므로, 동시성이 떨어지는 문제점이 존재합니다.

6) Sequelize의 트랜잭션
Sequelize의 트랜잭션은 COMMIT,ROLLBACK을 수동으로 사용하여 트랜잭션을 관리하는 UnManaged 트랜잭션과 Sequelize가 자체적으로 트랜잭션의 성공과 실패를 관리하는 Managed트랜잭션이 존재합니다.

profile
To Infinity and Beyond

0개의 댓글