트랙잭션격리수준
Ingue Jang edited this page Oct 1, 2022
·
4 revisions
다른 트랜잭션이 접근 못하도록 하는것
- 데이터베이스 성능이 떨어지게 된다.(4번 SERIALIZABLE만 아니면 실제로 그렇게 차이는 아니라고함)
- 하지만 Locking 수준을 높이면 느려지고 낮으면 데이터가 잘못될 수도 있음. 그래서 적절하게 조율 필요!!
커밋 기준이다!!
- READ UNCOMMITTED(레벨 0, 절대 안씀)
- 한 트랜잭션의 변경된 내용을 커밋이나 롤백과 상관 없이 다른 트랜잭션에서 읽을 수 있는 격리 수준
- 사용자1이 A라는 데이터를 B라고 변경 중인데, 사용자2 접근 가능 조회시 B로 읽는다. (더티리드)
- (사용자1 트랜잭션이 실패라면 큰 혼란,, 계좌 조회시 500 보였는데,, 100으로,, 보임)
- 모든 부정합 문제 발생
- 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 발생
- 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개
- 인서트는 막지 못한다,, 보였다 안보이는 (팬텀리드)
- SERIALIZABLE(레벨 3)
- 한 트랜잭션을 다른 트랜잭션으로부터 완전히 분리하는 격리 수준
- 모든 부정합 문제 해결
- 둘 다 복구
- 이러한 레벨1,2 이루어지는게 가능한게 UNDO 영역을 읽기 때문
- REDO는 복구를 할때 사용자가 했던 작업을 그대로
- UNDO는 사용자가 했던 작업을 반대로 진행합니다. 즉 사용자의 작업을 원상태로 돌립니다.
💡참조