본문 바로가기

MariaDB

MariaDB 트랜잭션 격리 수준(isolation level)은 어떤 것으로 설정해야 할까?

트랜잭션 격리수준에 대해 알아보자

 

격리수준을 READ UNCOMMITED 로 변경하는게 좋다고 제안을 받았다.
트랜잭션에 대해서는 이해하고 있었지만 트랜잭션 격리 수준에 대해서는 정확히 알지 못해서
이번에 정리하면서 학습하기로 하였다.

 

 

트랜잭션 격리수준의 중요성

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때 데이터의 일관성과 격리를 관리하는데 사용된다.

 

데이터 일관성 보장

  • 격리 수준은 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션이 다른 트랜잭션에 의해 수행 중인 작업에 대해 알지 못하도록 하는것이다.
  • 독립된 트랜잭션은 다른 트랜잭션에 영향을 받지 않고 자신의 작업을 수행하며, 이로써 데이터의 일관성이 유지된다.

동시성 제어

  • 둘 이상의 트랜잭션이 동일한 데이터를 수정하려고 할 때 충돌이 발생할 수 있다.
  • 격리 수준은 이러한 충돌을 방지하고 동시성을 제어하여 여러 트랜잭션이 안전하게 병행 수행할 수 있도록 한다.

성능 최적화

  • 높은 격리 수준은 데이터 동시성 제어를 강화하지만 성능에 영향을 미칠 수 있다.
  • 낮은 격리 수준은 동시성이 향상되지만 데이터에 대한 일관성 보장이 감소할 수 있다.
  • 높은 격리 수준은 데이터 일관성을 보다 확실하게 유지할 수 있지만 성능이 감소할 수 있다.

 

트랜잭션 격리수준의 종류

READ UNCOMMITED

  • MariaDB에서 제공하는 트랜잭션 격리 수준 중 가장 낮은 수준입니다.
  • 이 수준은 트랜잭션이 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽을 수 있습니다.
  • 더티 읽기(Dirty Read)가 발생할 수 있으며, 데이터 일관성과 무결성이 낮아지고, 동시성이 높아지기에 성능은 향상될 수 있습니다.

READ COMMITED

  • 트랜잭션이 커밋된 데이터만 읽을 수 있습니다.
  • 더 높은 데이터 일관성을 제공하며, 동시성도 일정 수준 유지할 수 있습니다.
  • 보통 일반적인 운영 환경에서 사용되며, 상당한 데이터 일관성이 요구되는 경우에 적합합니다.

REPEATABLE READ

  • 트랜잭션 시작 시점에 읽은 데이터를 트랜잭션이 종료될 때까지 일관성이 있게 유지합니다.
  • 다른 트랜잭션에서의 변경이 현재 트랜잭션에 영향을 미치지 않음을 의미합니다.
  • 동시성은 일정 수준 유지되지만, 더 높은 일관성이 필요한 경우에 사용됩니다.
  • 일반적인 운영 환경에서 안전성과 데이터 일관성을 중시하는 경우에 선택될 수 있습니다.

SERIALIZABLE

  • MariaDB에서 가장 높은 트랜잭션 격리 수준 중 하나로, 모든 읽기 및 쓰기 작업이 순차적으로 진행되어 트랜잭션 사이에 완벽한 격리를 제공합니다.
  • 한 트랜잭션이 데이터를 읽으면 해당 데이터에 대한 잠금을 설정하고, 트랜잭션이 종료될 때까지 다른 트랜잭션들은 해당 데이터에 대한 변경을 할 수 없습니다.
  • 데이터 일관성과 안전성을 최우선으로 하는 환경에서 사용됩니다.

 

높은 격리수준 순서

SERIALIZABLE > REPEATABLE READ > READ COMMITTED > READ UNCOMMITTED

 

결론

트랜잭션 격리 수준을 선택할 때에는 성능과 데이터 일관성 사이에 적절한 균형을 찾아야 합니다.격리 수준이 높을 경우 데이터 일관성은 높아지지만, 성능을 저하시킬 수 있습니다. 반대로 더 낮은 격리 수준은 성능을 향상시킬 수 있지만, 데이터 일관성이 떨어질 수 있습니다.

 

데이터의 일관성이 조금 낮아져도 되는 운영 환경이고, 성능을 가장 최우선으로 생각한다면 READ UNCOMMITED로 설정하는 것도 괜찮을것 같습니다.