DB_5 트랜잭션

백소현·2025년 5월 25일

DB

목록 보기
1/5
post-thumbnail

1. 트랜잭션

  • 여러 쿼리를 논리적으로 하나의 작업으로 묶어주는 것
  • 예시 - 거래가 일어날 때의 과정
    • 구매자 계좌에서 만원 출금

    • 판매자 계좌에 만원 입금

      → update - 구매자 계좌에서 만원 빼기, 판매자 계좌에 만원 더하기

→ 이 두 개의 업데이트문 처리 과정에서 서버 다운과 같은 오류가 발생할 수 있음

  • 이를 방지하기 위해 나온 것이 트랜잭션

  • 쿼리들을 하나의 트랜잭션으로 묶어서 해당 쿼리가 모두 실행되거나 아무 쿼리도 실행되지 않도록 함

  • 데이터베이스가 데이터를 안정적으로 보장할 수 있게 함

  • 하나의 트랜잭션은 커밋 혹은 롤백 됨

    • 커밋 : 트랜잭션으로 묶인 모든 쿼리가 성공되어 트랜잭션 쿼리 결과를 실제 데이터베이스에 반영
    • 롤백 : 쿼리 실행 결과를 취소하고 데이터베이스를 트랜잭션 이전 상태로 되돌리는 것

2. 트랜잭션의 성질

  • 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질
  • ACID
    • Atomicity(원자성) : 트랜잭션은 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 함(트랜잭션의 중간 상태를 DB에 반영하면 안 됨)

    • Consistency(일관성) : 트랜잭션 작업 처리 결과는 항상 일관성이 있어야 함. 데이터베이스는 항상 일관된 상태를 유지해야 한다.

    • Isolation(독립성) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션의 연산에 끼어들 수 없음 (각각의 트랜잭션은 서로 간섭 없이 독립적으로 이루어져야 함)

    • Durability(지속성) : 트랜잭션이 성공적으로 완료되었으면 결과는 영구히 반영되어야 함

      → 트랜잭션이 이론적으로 보장해야 하는 성질. 성능을 위해 손실 보장이 완화되기도 함

3. 트랜잭션 격리 수준

  • 동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 성질

read-uncommitted

read-committed

repeatable-read

serializable

→ 위로 갈수록 동시성이 높고 아래로 갈수록 데이터 정합성이 높음

  1. read-uncommitted
    • 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것 허용
    • 더티리드 현상이 발생할 수 있음(A가 커밋 되지 않고 롤백할 때, B는 수행 중이던 값으로 쿼리 진행)
  2. read-committed
    • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
    • 트랜잭션이 이루어지는 동안 다른 사용자는 해당 데이터에 접근 불가능
    • Non-Repeatable Read 발생 가능 (같은 트랜잭션에서 select 했을 때 두 결과가 다르게 나타나는 경우)
  3. repeatable-read
    • 트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장
    • 한 트랜잭션이 조회한 데이터는 트랜잭션이 종료될 때까지 다른 트랜잭션이 변경하거나 삭제하는 것을 막음 → Non-Repeatable Read 발생하지 않음
    • Phantom Read 발생 가능 (Non-Repeatable Read의 한 종류. 조건이 유무와 상관 없이 select 할 때 나타나는 현상. 해당 쿼리로 읽히는 데이터에 들어가는 행이 새로 생기거나 없어져 있는 현상)
  4. serializable
    • 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근 불가
    • ACID 성질이 엄격하게 지켜지나 성능이 떨어짐

4. 트랜잭션 전파 타입

  • 트랜잭션이 시작하거나 참여하는 방법에 관한 설정

→ 스프링에서 제공하는 트랜잭션 전파 타입

0개의 댓글