[DB] 동시성 문제

이름이름·2022년 12월 11일
0

DB

목록 보기
5/7

트랜잭션 격리성(Transaction Isolation)

앞서 트랜잭션의 4가지 특징인 ACID중에서 I(isolation=격리성)에 해당한다
격리성은 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다라는 정의를 가지고 있다.
막연하게 접근할 수 없다라기 보다는 일반적으로 격리 레벨이 존재하며 DB에 따라 설정이 가능합니다.
이런 격리성은 강하게 처리할 수 있으며 반대로 약하게 처리할 수도 있습니다.

격리성 관련 이슈

Dirty Read

commit되지 않은 데이터를 읽는 문제
예를들어 t1이 데이터에 접근하여 값을 'A'에서 'B'로 변경 후 아직 커밋하지 않은 상태에서, t2가 해당 데이터를 read하면 'B'를 읽게 됨.
이 때 t1이 최종 커밋을 하지 않고 종료되면, t2가 가진 데이터가 꼬이게 됨

Non-repeatable Read

하나의 트랜잭션에서 두 번의 동일한 조회를 하였을 때, 서로 다른 결과가 조회되는 현상 -> 같은 row가 선택은 되지만 그 row의 데이터값이 전과 다른 상태
격리 수준이 Read Committed 이하일 때 나타남

Phantom Read

없던 record가 생기거나, 있던 record가 사라지는 경우
조건을 걸어 조회했을때 이전과 다른 row가 나오는 경우임
그니까 다른 트랜잭션이 insert해서 내가 검색했던 row가 밀려나거나 해서 다른 row가 선택되는것

참고:https://stackoverflow.com/questions/11043712/what-is-the-difference-between-non-repeatable-read-and-phantom-read

격리(isolation) 레벨

동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정

  • 아래 순서대로 uncommitted가 격리수준이 가장 낮고 Serializable이 격리수준이 가장 높다

(Lv1) Read Uncommitted

읽을 수 있다 / uncommitted 된 것을
한 트랜잭션의 변경된 내용을 COMMIT이나 ROLLBACK과 상관 없이 다른 트랜잭션에서 읽을 수 있는 격리수준

다른 트랙잭션에서 commit하지 않은것을 다른 트랜잭션이 읽을 수 있는 레벨
-> dirty read 현상 발생가능

(Lv2) Read committed

<읽을 수 있다 / committed된 것을>
COMMIT이 완료된 데이터만 조회 가능한 격리수준

특정 트랜잭션에서 데이터가 변경되었으나, 아직 커밋되지 않은 상태라면 다른 트랜잭션에서는 해당 데이터에 접근했을 때 트랜잭션 시작 전 데이터를 읽어온다. 커밋이 된 이후에서야 변경된 데이터 값을 읽어올 수 있다.
-> phantom read 현상 발생가능
-> non-repeatable read 현상 발생가능

(Lv3) Repeatable Read

트랜잭션이 시작되기 전에 커밋된 내용에 관해서만 조회할 수 있는 격리수준

자신의 트랜잭션 번호보다 낮은(먼저 일어난) 트랜잭션 번호에서 변경(커밋)된 것만 보게 됨
특정 행을 조회시 항상 같은 데이터를 응답하는 것을 보장하는 격리 수준이다. 하지만, SERIALIZABLE과 다르게 행이 추가되는 것을 막지는 않는다. 이로 인해 Phantom read 현상이 발생할 수 있다.

(Lv4) Serializable

한 트랜잭션을 다른 트랜잭션으로부터 완전히 분리하는 격리수준

특정 트랜잭션이 사용중인 테이블을 다른 트랜잭션이 접근할 수 없도록 잠근다. 가장 높은 데이터 정합성을 갖으나, 성능은 가장 떨어진다. 이 격리 수준에서는 단순한 SELECT 쿼리가 실행되더라도, 데이터베이스 락이 걸려 다른 트랜잭션에서 데이터에 접근할 수 없게된다.

profile
공부 정리

0개의 댓글