1일 1개념정리 (24년 8월~12월)/데이터베이스

1일1개 (79) - 외로운 트랜잭션

poetDeveloper 2024. 11. 12. 23:54

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#79. DB Isolation

지난번에 직렬화 라는 것을 정리했다.

https://100won-developer.tistory.com/entry/1%EC%9D%BC1%EA%B0%9C-74-%EC%A7%81%EB%A0%AC%ED%99%94

 

1일1개 (74) - 내 통장이 사실은 무한 ATM ?

1일 1개념정리 24.08.09.금 ~  큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!#74. 직렬화DB에서

100won-developer.tistory.com

사실 직렬화는 상당히 높은 수준의 트랜잭션 격리였다. 오늘은 그보다 더 낮은 수준의 격리에는 무엇이 있는지 알아보자.

 

Isolation

DB에서 말하는 Isolation은 격리, 고립 정도로 해석하는데 동시에 여러 트랜잭션이 수행될 때 서로 간섭 없이 일관성을 유지하는 기술이다. 동시에 A, B 트랜잭션이 실행될 때 다른쪽의 트랜잭션에 영향을 주지 않는 것이 목표이고, 이를 통해 무결성 유지를 할 수 있다.

 

DB 공부하면서 갑자기 Isolation이 나왔다고 생각할 수 있는데, 아니다 !! ACID에서 I가 isolation이다. 이것을 종종 Integrity로 오해하는데, 아니다 !!!!! (중요) 아무튼 트랜잭션의 성질 중 하나이고, 격리 레벨을 조정할 수 있다. 여기서 말하는 격리 레벨은, 이쪽 트랜잭션이 저쪽 트랜잭션의 변화를 얼마나 지켜볼 수 있는가를 정의하는 것이다. 당연히 격리 수준이 높을수록 나의 트랜잭션에서 저쪽 트랜잭션의 변화를 알아챌 수 없고, 따라서 트랜잭션의 일관성도 높아진다.

 

Isolation Level

격리 수준은 4가지로 분류된다.

 

mysql 기준으로 다음 코드로 격리 수준을 설정한다.

SET SESSION transaction_isolation='READ-COMMITTED';

 

(참고) 두단어로 되어있으면 하이푼이 꼭 들어가야 됐던 것으로 기억한다.

 

A, B 두개의 서로 다른 트랜잭션에서의 상황이라고 생각하면 쉽다. 원래는 다음과 같은 프로세스를 따라야 한다.

(1) start transaction이라고 하고, (2) 정보 update를 한 뒤, (3) commit을 해야 다른 트랜잭션에서 볼 수 있다.

이런 상황을 알고 아래를 읽어보자.

 

1. Read Uncommitted (제어단계 下)

  • 다른 트랜잭션에서 업데이트 한 뒤에 커밋을 안해도 이쪽 트랜잭션에서 그 변경사항이 보임.
  • Dirty Read 문제 발생할 수 있음. = 커밋되지 않은 데이터가 보여서 오류가 있는 데이터를 읽을 수 있다.

2. Read Committed (제어단계 中下)

  • 트랜잭션 진행중인데도 다른 곳에서 업데이트와 커밋을 하면 그게 이쪽에도 반영돼서 보임.
  • 커밋된 데이터만 읽으므로 Dirty Read는 방지됨, 하지만 조회를 "다시" 하면 다른 값이 보일 수 있음.

3. Repeatable Read (default in MySQL, 제어단계 中上)

  • 트랜잭션 진행중이면 다른 곳에서 업데이트와 커밋을 해도 여기엔 반영 안됨.
  • 그래서 여기선 조회를 다시 해도 같은 값을 읽게 됨

4. Serializable (제어단계 上)

  • 트랜잭션 진행중이 다른 작업 아예 불가능, 완벽한 격리 (직렬화)
  • 트랜잭션 동시처리 불가능하므로 성능 저하 발생할 수 있음.
반응형