본문 바로가기
ComputerScience/RealMySQL

5.트랜잭션과 잠금 - MySQL 격리 수준

by 규난 2022. 12. 12.
728x90

이번 포스트에서는 MySQL 격리 수준에 대해서 알아보겠습니다.

 

MySQL 격리 수준

여러 트랜잭션이 동시에 변경 및 조회를 수행할 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하려는 데이터를 볼 수 있게 허용할지 말지를 결정하여 일관성을 유지하는 설정입니다. 

 

격리 수준은 크게 밑의 4가지로 나뉩니다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ(MySQL InnoDB Default)
  • SERIALIZABLE

READ UNCOMMITTED

각 트랜잭션 변경 내용이 commit이나 rollback 여부에 상관없이 다른 트랜잭션에서 조회 가능한 격리 수준입니다.

이처럼 다른 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상을 DIRTY READ라고 합니다.

READ UNCOMMITTED는 RDBMS 표준에서 격리 수준으로 인정하지 않을 정도로 정합성 문제가 많아서 사용하지 않는 것이 좋습니다.

READ UNCOMMITTED

 

READ COMMITTED

어떤 트랜잭션에서 변경하고 commit 한 데이터에 대해서만 다른 트랜잭션에서 조회가 가능하여 DIRTY READ가 발생하지 않는 격리 수준입니다.

READ COMMITTED

자신의 트랜잭션 번호보다 높은 트랜잭션에서 변경하고 commit 한 데이터도 조회가 가능하기 때문에 NON-REPEATABLE READ 현상이 나타날 수 있습니다.

NON-REPEATABLE READ 현상

REPEATABLE READ

자신의 트랜잭션 번호보다 이전에 commit된 데이터만 조회가 가능한 격리 수준입니다. 즉, 트랜잭션 내의 모든 쿼리가 첫 번째 읽기에 의해 설정된 데이터의 스냅샷과 동일한 스냅샷을 보게됩니다. 언두 영역을 통해 동일 트랜잭션 내에서 동일한 결과를 보여줄 수 있게 보장합니다.

REPEATABLE READ

그렇다고 항상 동일한 결과를 볼 수 있지는 않습니다.

update 쿼리 같은 경우에는 레코드에 쓰기 잠금을 걸어야 하는데 언두 영역에는 쓰기 잠금을 걸 수 없어서 실제 테이블에 쓰기 잠금을 걸게 되는데 이때 다른 트랜잭션에서 변경한 레코드가 보였다 안 보였다 하는 PHANTOM READ 현상이 나타날 수 있습니다.

PHANTOM READ 현상

SERIALIZABLE

한 트랜잭션에서 읽고 쓰는 레코드는 다른 트랜잭션에서 절대 접근할 수 없는 격리 수준입니다(단순한 읽기는 가능). InnoDB는 각 트랜잭션에서 읽기만 수행할지 아니면 row를 수정할지 사전에 알지 못하므로 모든 일반 select 문을 암시적으로 select ... for share로 변환하기 때문에 REPEATABLE READ에서 발생하는 PHANTOM READ 현상이 발생하지 않습니다.

728x90