ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션
    💻 computer science/📦 database 2022. 10. 5. 01:46

    🤔 트랜잭션


    💡 트랜잭션
    - 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
    - 데이터베이스에 접근하는 방법은 쿼리, 즉 여러 개의 쿼리들을 하나로 묶는 단위 

    ACID 특징

     

    1. 원자성 (Atomicity)

    “all or nothing”

     

    원자성(atomicity)은 트랜잭션이 이루어지는 작업(관련된 일)이 모두 수행되었거나 되지 않았거나를 보장하는 특징

     

    트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안된다!!!

     

     

    왜❓

    • 트랜잭션이 update, insert, 외부 API 호출로 이루어진 상황에서, 외부 API 호출이 실패하여 롤백을 한다면 내부적인 롤백에는 문제가 없다.
    • 하지만, 만약 외부 API 호출을 완료하고 나서 롤백을 한다면, 외부 API로 반영된 내용은 롤백하기가 어렵다
      • 따라서, 만약 외부 API를 호출하는 것이 있다면 롤백 처리에 주의해야 한다.
      • 롤백이 일어났을 때 어떻게 해야 할 것인지에 대한 해결 방법이 있어야하고 트랜잭션 전파 를 신경써서 관리해야 한다.

     

    커밋(commit)

    • 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
    • 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것

     

    롤백(rollback)

    • 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일

     

    트랜잭션 전파

     

    > 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것.

     

    Spring 프레임워크

    • @Transactional 애너테이션을 통해 여러 쿼리 관련 코드들을 하나의 트랜잭션으로 처리한다.
    @Service
    @Transactional(readOnly = true)
    public class MemberService {
    
    	private final MemberRepository memberRepository;
    
    	public MemberService(MemberRepository memberRepository) {
    		this.memberRepository = memberRepository;
    	}
    }
    

     

    2. 일관성 (Consistency)

    ‘허용된 방식’으로만 데이터를 변경해야 한다.

    트랜잭션 시작 전, 후 상태가 일관성이 있다.

    • 여러가지 조건, 제약, 규칙에 따라 유효함을 가져야 한다.

     

    3. 격리성 (Isolation)

    트랜잭션 수행중 다른 트랜잭션이 서로 끼어들지 못한다(방해 ❌, 독립적이다)

    • 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.

     

    그냥 순차적으로 하면??

    • 성능이 나빠진다.
    • 격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다. (고립 단계)

    트랜잭션 고립 단계 (격리 수준)

     

    동시에 트랜잭션이 DB에 접근할 때 어떻게 하는지에 따라 단계로 구분

    아래로 갈 수록 동시성이 강해지지만 격리성은 약해진다.

     

    1️⃣ SERALIZABLE

    말 그대로 트랜잭션을 순차적으로 진행시키는 것

    여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.

    매우 엄격한 수준

    • 교착 상태(deadlock)가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준.

     

    2️⃣ REPEATBLE_READ

    하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아준다.

    새로운 행을 추가하는 것은 막지 않는다.

    • 따라서, 이후에 추가된 행이 발견될 수 있다.
    • phantom read 발생

     

    3️⃣ READ_COMMITTED

    가장 많이 사용되는 격리 수준

    MySQL, PostgreSQL, 오라클 에서 기본값으로 설정

    다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다.

    • 즉, 커밋 완료된 데이터에 대해서만 조회를 허용
    • phantom read + non-repeatable read 발생

     

    4️⃣ READ_UNCOMMITTED

    가장 낮은 격리 수준

    하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠르다.

    • 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 ‘어림잡아’ 집계하는데 사용하면 좋다.
    • phantom read + non-repeatable read + dirty read 발생

     

    격리 수준에 따라 발생하는 현상

     

    Phantom read

    • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
    • 사용자 A가 조회 → B가 다른 데이터 삽입 → 다른 결과가 조회

    non-repeatable read

    • 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
    • A가 조회 → B가 데이터 업데이트 → A가 다른 값을 조회
    ❗ phantom read 와 non-repeatable read 의 다른점
    - non-repeatable read 은 행 값이 달라질 수 있는데
    - phantom read 은 다른 행이 선택될 수 있다는 점이 다르다.

     

    dirty read

    • non-repeatable read 와 유사
    • 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 ‘커밋되지 않은’ 행의 데이터를 읽을 수 있을 때 발생
    • A가 데이터를 업데이트한 내용이 커밋되지 않은 상태 → B가 조회시 업데이트 된 내용이 조회된다.

     

    4. 지속성 (Durability)

     

    성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.

    → 이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻한다.

    • 체크섬
    • 저널링
    • 롤백

    등의 기능을 제공

     

    무결성


     

    ❓ 무결성

    • 데이터의 정확성, 일관성, 유효성을 유지하는 것.

    무결성이 유지되어야 데이터베이스에 저장된 데이터 값과

    그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.

     

    종류

    이름 설명
    개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
    참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
    고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다.
    NULL 무결성 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건

     

    참고 자료

    http://www.yes24.com/Product/Goods/108887922

    '💻 computer science > 📦 database' 카테고리의 다른 글

    📂 MySQL - 트랜잭션 격리 수준  (0) 2024.05.11
    인덱스  (0) 2022.10.05
    SQL / NoSQL  (1) 2022.10.05
    정규화  (0) 2022.10.05
    데이터베이스 기본  (1) 2022.10.05

    댓글

Designed by Tistory.