Prisma 트랜잭션의 독립성 수준

김동욱·2024년 12월 3일

데이터베이스

목록 보기
4/7

트랜잭션(Tranjaction)의 독립성 수준(Isolation level)

const updatedPlayer = await prisma.$transaction(
      async (tx) => {
        return updatedPlayer;
      },
      {
        isolationLevel: Prisma.TransactionIsolationLevel.ReadCommitted,
      }
    );
//<트랜잭션 코드 >

4가지 트랜잭션 레벨

- Read Uncommitted

가장 낮은 격리 레벨.
트랜잭션이 커밋 완료되지 않은 데이터도 실시간으로 읽을 수 있음.
Dirty Read 문제 발생 가능 : 커밋되지 않은 데이터를 읽고, 그 데이터가 롤백되면 발생하는 문제

예)
고객 A가 상품 2개를 결제하려 함.
결제 오류남
고객 B의 눈에는 상품 2개가 없어진 것처럼 보임.


- Read Commited

가장 많이 사용되는 레벨. 기본값으로 주로 사용.
트랜잭션이 커밋 완료된 데이터만 읽을 수 있음.
Non-Repeatable Read : 동일한 트랜잭션 내에서 동일한 데이터를 다시 읽을 때 값이 변경되는 문제

예)
고객 A가 상품의 재고를 확인한다. 재고1개
고객 A가 상품을 장바구니에 추가하고 결제 과정을 시작한다.
고객 B가 상품을 구매하고 결제를 완료하여 재고가 0으로 수정된다.
고객 A가 결제를 완료할 때 재고가 0인 상태.


- Repeatable Read

읽는 데이터에 Read Lock을 걸어 다른 트랜잭션이 데이터를 수정하지 못하게 함.
Phantom Read : 읽기 쿼리 실행시 새로운 행이 추가되거나 사라지는 문제
읽기 일관성이 중요한 경우 사용.
여러개의 트랜잭션이 동시에 같은 데이터를 확인하고 업데이트를 시도할 수 있지만 하나의 트랙잭션만 성공할 수 있다.


- Serializable

가장 높은 수준의 격리.
전체 테이블에 락을 걸어 동시성을 차단.
데이터의 높은 정확성이 요구되는 작업에 사용.
동시에 수행 가능한 트랜잭션 수가 제한되어 성능이 저하 문제 발생.
성능에 문제가 있어 거의 사용하지 않음.

profile
갓겜만들어야지

0개의 댓글