트랜잭션의 격리 수준(isolation level) 이란?

코딩하는범이·2022년 8월 23일
0
post-thumbnail

트랜잭션의 격리 수준(isolation level)이란?

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

격리 수준

격리 수준은 크게 4가지로 볼 수 있는데 아래로 순서대로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다.

READ UNCOMMITTED

READ UNCOMMITTED 격리수준에서는 어떤 트랜잭션의 변경내용이 COMMIT이나 ROLLBACK과 상관없이 다른 트랜잭션에서 보여지는 것을 말한다.

그래서 다른 트랜잭션에서 Commit 하지 않아도 조회 했을때 데이터가 보여질 수 있다. 이를 더티 리드(Dirty Read) 라고 한다.

이런식으로 데이터 정합성에 문제가 많아, RDBMS 표준에는 격리수준으로 인정하지 않는다고 한다.

READ COMMITTED

트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
오라클 RDBMS에서 기본으로 사용하고 있다.

그렇지만 NON-REPETABLE READ 정합성 문제는 해결되지 않았다. 하나의 트랜잭션내에서는 SELECT를 수행할 경우 항상 같은 결과를 반환해야 하는데 중간에 커밋된 내용이 있으면 다른 결과를 내려줄 수 있기 때문이다

이런 문제가 발생할 수 있기 떄문에 격리수준에 의해 실행되는 SQL 문장이 어떤 결과를 출력할 지 정확히 예측하고 있어야 한다.

REPEATABLE READ

트랜잭션이 시작하기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리 수준이다.
MySQL DBMS에서 기본으로 사용하고 있다. 이러한 특성으로 NON-REPETABLE READ 정합성 문제는 어느 정도 해결이 됬다.

REPEATABLE READ 격리 수준에서는 시작된 시점에 데이터를 일관되게 보여줘야 하기 때문에 한 트랜잭션의 실행시간이 길어질수록 해당 시간만큼 멀티 버전을 관리해야 하는 단점이 있다.
그러나 실제로 오래 지속되는 경우가 없어 READ COMMITTED과의 성능 차이는 거의 없다고 한다.

SERIALIZABLE

가장 단순하고 가장 엄격한 격리수준으로 InnoDB에서 기본적으로 순수한 SELECT 작업은 아무런 잠금을 걸지않고 동작하는데, 격리수준이 SERIALIZABLE일 경우 읽기 작업에도 잠금을 설정하게 되고, 이러면 동시에 다른 트랜잭션에서 이 레코드를 변경하지 못하게 된다.
이러한 특성 때문에 동시처리 능력이 다른 격리수준보다 떨어지고, 성능저하가 발생하게 된다.

출처

  1. https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/
profile
기록 그리고 기억

0개의 댓글