Hello

43.44. 45 DB 격리수준 READ COMMIT & 정합성 문제 & REPEACTABLE READ

by 볼빵빵오춘기

트랜잭션

트랜잭션은 일이 처리되기 위한 가장 작은 단위이다.

더보기

ex) 유튜브 강의 한 개 [강의 준비, 영상 찍기, 영상 업로드] 를 해야 한다.

그러면 [강의 준비, 영상 찍기, 영상 업로드]가 유튜브에 한 강의를 올리기 위한 가장 작은 단위이다.

만약 강의준비가 목적이었다면 강의준비 자체가 트랜잭션이 될 수 있다.

이런 하나의 트랜잭션이 모여서 트랜잭션이 될 수 있고 이런 트랜잭션이 모여서 서비스라 부른다.

 

오라클 - DB 격리수준

오라클 - read commit이라는 트랜잭션을 사용 ⇒ 즉 commit된것만 read를 한다.

더보기

따라서 undo 영역에 update문 날리고 commit하기전의 값을 가지고 있다가 commit을 하면 그 undo 영역의 값도 변경해준다.

 

READ COMMIT의 정합성 문제

여러 개의 트랜잭션이 진행될 때 한 트랜잭션이 commit을 하고 한 트랜잭션은 select를 한다는 가정하에 값으로 insert를 하려고 한다면 data변경으로 인해 정확성이 떨어지는데 이 때 값이 보였다 안보였다 한다. 이런 값이 보였다 안보였다하는 것을 phantom read라 한다.

 

부정합

  • 트랜잭션이 시작될 때 같은 것을 select를 한다고 하면 같은 값이 나와야한다.
    • 하지만 중간에 다른 값(=다른 결과)가 나온다.
    • 값이 보였다 안보였다 한다. (=phantom read)

⇒ 위의 현상들을 부정합이라고 한다.

 

MySQL - DB 격리수준

InnoDB 스토리지 엔진 → REPEACTABLE READ 이상 사용 → 부정합 발생X

 

REPEACTABLE READ

Transaciton 12가 commit을 함으로써 undo에 empno=11은 장보고가 남는다.

그러면 read commit은 commit 된 결과만 볼 수 있다.

따라서 t12 commit 후 t11이 종료가 되는데 t11의 (?)부분은 아직 트랜잭션이 종료되지 않은 상태이기 때문에 값이 ‘장보고’가 나오는게 아니라 ‘임꺽정’이 나온다. (특: 자기 트랜잭션번호보다 낮은 undo 로그만 본다.)

이것이 REPEACTABLE READ 이다. ⇒ 부정합이 나오지 않는다.

(참고 : 만약 T11 트랜잭션을 시작과 종료하지않는다면 S(?)의 값은 ‘장보고’가 나올 것이다.)

 

스프링에서는 어떻게 사용되나?

CRUD 로 생각하면 Insert, Update, Delete에서만 @Transactional 어노테이션을 붙이면 된다고 생각 할 수있다.

하지만 Select 할 때도 정합성을 위해 @Transactional 을 붙여주자.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기