본문 바로가기
데이터베이스

데이터베이스 격리수준

by kcj3054 2022. 6. 22.

트랜젝션

  • 여러 읽기/쓰기를 논리적으로 한번에 묶은 것.
  • 트랜잭션 범위는 커넥션 기준.
  • 트랜잭션과 외부 api연동은 주의해야한다. 외부 api 호출이 성공하고, 난뒤 rollback을 하면 호출된 api는 롤백이안된다.
  • 글로벌 트랜잭션은 두 개 이상의 자원(db, 메시징 큐)을 한 트랜잭션으로 처리하는 것이다. db insert를 하고 메시지에 데이터를 넣는 것은 하나로 묶을 수 있다. 그래서 두개 이상 자원에 대한 처리가 쉽지만 성능이 좋지않다.

같은 데이터 동시 접근

  • 여러 클라이언트가 같은 데이터에 접근할 때 문제가 발생하는데 그것을 race condition이라고한다.
  • 순서대로 실행하면 되지만 성능이 저하된다 그래서 다양한 격리 수준을 지원한다.

Read Committed

  • Read Committed는 커밋된 데이터만 읽고, 커밋된 값과 트랜잭션 값을 따로 보관한다.
  • 커밋된 데이터만 쓸 수 있다, 행 단위 잠금을 사용한다, 같은 데이터를 수정한 트랜잭션이 끝날 때 ㄲ ㅏ지 대기
1) READ UNCOMMITTED 
READ UNCOMMITTED 수준은 잠금의 4가지 레벨 중 가장 낮은, 즉 가장 느슨한 단
계의 잠금 수준이다. 이 수준은 특정 트랜잭션에서 배타적 잠금을 설정하고 있어도, 
해당 데이터를 볼 수는 있게 한다. 
물론 해당 리소스에 대한 수정작업은 모든 잠금 수준에서 불가능하다. 
READ UNCOMMITTED는 배타적 잠금이 설정된 리소스(데이터)라고 하더라도, 볼 
수(SELECT) 있게 하는, 잠금 중 가장 느슨한 단계이다. 배타적 잠금을 공유 잠금과 
호환되게 하는 것이라고 보면 되겠다.
출처: https://battleracoon.tistory.com/2 [개발하는 너구리:티스토리]

2) READ COMMITTED 

READ COMMITTED 는 말그대로, COMMIT 된 트랜잭션만을 읽자는 것이다. 
이것은 잠금을 건 트랜잭션에서의 입장이 아니다. 잠금을 건 트랜잭션에 대해서 
SELECT 하려는 또 다른 트랜잭션에서의 입장이다. 현재는 해당 트랜잭션에 대해 
잠금이 걸려 있으면 해당 잠금의 종류에 따라 볼 수도 있고 보지 못할 수도 있다. 
공유 잠금에 대해서는 볼 수 있으며, 배타적 잠금이 걸려 있으면 볼 수 없는것이 
현재 상태이다. SELECT 한다는 것은 공유 잠금이고, 공유 잠금은 공유 잠금과는 
호환되지만 배타적 잠금에 대해서는 호환되지 않기 때문이다.
출처: https://battleracoon.tistory.com/2 [개발하는 너구리:티스토리]

3) REPEATABLE READ 

읽는 데이터의 일관성에 관한 얘기이다. 잠금이 설정되어 있을 때, 트랜잭션 시작 전
과 시작 후의 데이터를 동일하게 읽게 함으로써, 읽는 데이터의 일관성을 보장하는 
방법이 된다. 
REPEATABLE READ 수준은 트랜잭션 진행 중인 개체에 엑세스해서 데이터를 읽으
려고 할 때, 읽고자 하는 데이터에 일어나고 있는 변경이 성공될지 취소될지 불확실
한 상태에서, 확실하게 트랜잭션이 완료되기 전까지는, 변경전의 데이터를 읽게 함
으로써 데이터의 일관성을 보장해 주는 기법이다. 

4) SERIALIZABLE 

데이터의 범위에 대한 입력작업에 관한 이야기이다.
한 세션에서 특정 범위의 데이터를 읽고 있는 경우에 , 다른 세션에서 읽고 있는  특
정 범위내에 포함되는 데이터를 입력하는 경우에 입력을 하지 못하도록 한다.
출처: https://battleracoon.tistory.com/2 [개발하는 너구리:티스토리]

커밋되지 않은 데이터 읽기 dirty read [격리수준 ReadCommitted]

  • A라는 사람은 데이터를 insert하고 commit을 하지 않은 상태에서 B라는 사람이 조회를 하면 데이터가 깨지는 현상이 발생한다 dirty read..

커밋되지 않은 데이터 쓰기 dirty write [격리수준 ReadCommitted]

Repeatable Read

  • 트랜잭션 진행중인 동안에는 데이터가 변경 될 수 있다 그래서 같은 데이터를 읽게한다( 특정 버전에 해당하는 데이터만 읽는다)

Serializable

데이터변경 유실에 대한 몇 가지 처리 방법

  • 명시적으로 잠금
    • 조회할 때 수정할 행을 미리 잠금해서 select조차 못하게 막는다.

-CAS

  • 수정할 때 값이 같은지 비교해서 같은 값일 경우에만 수정을한다. 이것을 통해 변경이 유실되는 것을 방지

참고 출처 : https://battleracoon.tistory.com/2