Skip to content

트랙잭션격리수준

Ingue Jang edited this page Oct 1, 2022 · 4 revisions

📖 트랜잭션 격리수준

📌Locking

다른 트랜잭션이 접근 못하도록 하는것

  • 데이터베이스 성능이 떨어지게 된다.(4번 SERIALIZABLE만 아니면 실제로 그렇게 차이는 아니라고함)
  • 하지만 Locking 수준을 높이면 느려지고 낮으면 데이터가 잘못될 수도 있음. 그래서 적절하게 조율 필요!!

📌 격리수준

커밋 기준이다!!

  1. READ UNCOMMITTED(레벨 0, 절대 안씀)
  • 한 트랜잭션의 변경된 내용을 커밋이나 롤백과 상관 없이 다른 트랜잭션에서 읽을 수 있는 격리 수준
  • 사용자1이 A라는 데이터를 B라고 변경 중인데, 사용자2 접근 가능 조회시 B로 읽는다. (더티리드)
    • (사용자1 트랜잭션이 실패라면 큰 혼란,, 계좌 조회시 500 보였는데,, 100으로,, 보임)
  • 모든 부정합 문제 발생
  1. READ COMMITTED(레벨 1,오라클 DBMS에서 기본으로 사용)
  • COMMIT이 완료된 데이터만 조회 가능한 격리 수준(더티 리드 해결)
B 트랜잭션에서 27세 이하 조회
27살인 홍길동 조회됨
A 트랜잭션에서 홍길동 나이 28살이였네,, UPDATE SET 홍길동 나이 = 28살
B 트랜잭션에서 28세 이상 조회(변경되지 않은 이름이 조회됨)
28살인 홍길동 조회됨

B라는 트랜잭션이 27살이하 조회 > +500원 >(다른 트랙잰션 커밋) 28살 이상 조회 > +1000원 해당 데이터는 1500원을 받게됨,,, 
  • NON-REPETABLE READ 발생
  1. REPEATABLE READ(레벨 2)
  • 트랜잭션이 시작되기 전에 커밋된 내용에 관해서만 조회할 수 있는 격리 수준
  • 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된(+커밋된)것만 봄 (NON-REPEATABLE-READ 해결)
1번 트랜잭션 실행 - select * from A A:0개
1번 트랜잭션 실행 - update A 0개 성공 
   2번 트랜잭션 실행 - insert into A A:1개 커밋
1번 트랜잭션 실행 - select * from A A:0개
1번 트랜잭션 실행 - update A SET WHERE id =1 1개 성공 
1번 트랜잭션 실행 - select * from A A:1개
  • 인서트는 막지 못한다,, 보였다 안보이는 (팬텀리드)
  1. SERIALIZABLE(레벨 3)
  • 한 트랜잭션을 다른 트랜잭션으로부터 완전히 분리하는 격리 수준
  • 모든 부정합 문제 해결

image

📌 REDO,UNDO

  • 둘 다 복구
  • 이러한 레벨1,2 이루어지는게 가능한게 UNDO 영역을 읽기 때문
  • REDO는 복구를 할때 사용자가 했던 작업을 그대로
  • UNDO는 사용자가 했던 작업을 반대로 진행합니다. 즉 사용자의 작업을 원상태로 돌립니다.

💡참조