ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션
    카테고리 없음 2025. 3. 20. 00:48
    2주차 Database Study 

     

    • 데이터 정합성 : 데이터가 서로 모순이 없이 일관되게 일치해야함 ex) A가 변경되면 B도 똑같이 변경되어야함
    • 데이터 무결성 : 데이터의 값이 정확해야함 ex) 제약조건을 위반한 값이 있으면 안된다

     

    트랜잭션

    데이터베이스에서 일련의 작업을 하나로 묶어서 처리하는 것

     

    트랜잭션은 일련의 작업에 대한 데이터 정합성을 보장해준다. 

    작업 수행 도중 실패하게되면 모든 데이터가 이전 상태로 돌아간다 → 데이터 정합성 보장 = 데이터에 모순이 없음

     

     

    트랜잭션의 특성 : ACID

    Atomicity (원자성)

    트랜잭션 내 모든 작업이 하나로 처리되어야함

    ALL 성공 or ALL 실패

     

    Consistency (일관성)

    트랜잭션 시작/종료의 데이터베이스 상태는 일관되어야함

    데이터의 규칙이나 제약조건을 위반하면 안된다

     

    Isolation (격리성)

    각 트랜잭션은 독립적으로 실행되어야하며 트랜잭션 간 영향을 줄 수 없음

     

    Durability (지속성)

    트랜잭션이 완료되면 작업 내용이 정상적으로 반영되어야함

    트랜잭션이 완료되고 DB가 다운되더라도 값은 정확해야함

     

     

    트랜잭션의 기본 연산

    • 커밋 : 트랜잭션에서의 작업 내용을 데이터베이스에 영구적으로 저장
    • 롤백 : 트랜잭션을 취소하고 트랜잭션 이전 상태로 되돌리는 연산

     

    세이브포인트(Savepoint)

    특정 지점에 이름을 붙여 저장할 수 있는 기능 = 게임에서 체크포인트 느낌
    롤백 상황이 발생했을 때 전체 롤백이 아닌 세이브포인트까지만 롤백이 가능

    BEGIN TRANSACTION
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    SAVEPOINT sp1; //세이브 포인트 지정
    UPDATE accounts SET balance = balance + 100; //where문을 까먹음?
    ROLLBACK TO SAVEPOINT sp1; //세이브 포인트로 롤백​

    위 상황과 같이 where로 조건을 지정해야하는 것을 까먹어서 원복해야하는 경우
    세이브 포인트로 롤백하는 방식으로 사용할 수 있을 것같다.

    사용해본적은 없음

     

     

    트랜잭션 격리 수준

    여러 트랜잭션이 동시에 실행될 때 하나의 트랜잭션이 다른 트랜잭션의 작업을 볼 수 있는 정도

     

    읽기 미정 (Read Uncommitted)

    가장 낮은 격리 수준

    더티 리드 발생 가능 : 하나의 트랜잭션이 커밋되지않은 다른 트랜잭션이 변경사항을 읽는 현상

     

    ex)

    A 트랜잭션이 1을 2로 변경

    B 트랜잭션이 2를 읽고 3으로 변경 → 아직 완료가 안되었어도 읽을 수 있음

     

    만약 A 트랜잭션이 실패하게된다면 값은 3이 된다.

     

     

    읽기 커밋 (Read Committed)

    커밋한 데이터만 읽을 수 있음

    반복 불가능한 읽기 발생 가능 : 트랜잭션 수행시 반복 읽기 작업에서 중간에 다른 트랜잭션이 값을 변경하면 읽은 값이 서로 다를 수 있음

     

    ex) 

    A 트랜잭션이 1을 읽음

    B 트랜잭션이 1을 2로 변경 및 커밋

    A 트랜잭션이 다시 읽었는데 2 → B 트랜잭션이 값을 변경하고 커밋했기 때문에 같은 트랜잭션이더라도 값이 다름

     

    반복 가능한 읽기 (Repeatable Read)

    MySQL 기본 격리 수준

    처음 읽은 데이터를 반복해서 읽을 때 항상 동일한 값을 얻을 수 있도록 보장 : 스냅샷으로 생각하면 이해하기 쉬움

    팬텀 리드 발생가능 : 새로운 행이 추가되거나 기존행이 삭제될 때 값이 달라질 수 있음

     

    ex)

    A 트랜잭션이 COUNT 쿼리 → 결과 1

    B 트랜잭션이 INSERT 

    A 트랜잭션이 다시 COUNT 쿼리 → 결과 2  : 새로운 행이 하나 추가되었으므로 동일한 트랜잭션이더라도 값이 달라짐

     

    직렬화 (Serializable)

    가장 높은 격리 수준

    하나의 트랜잭션이 완료되기전까지 다른 트랜잭션은 대기

     

    트랜잭션 격리 수준이 높을 수록 안정성은 보장되지만 성능은 낮아진다

     

     

     

     

     

     

Designed by Tistory.