[Mariadb] Galera Cluster에서 Lost Update 문제 방지 전략

 분산 데이터베이스 환경에서 데이터 무결성과 일관성을 유지하는 것은 시스템 신뢰성의 핵심입니다. 특히 여러 트랜잭션이 동시에 동일한 데이터를 수정할 때 발생할 수 있는 Lost Update 문제는 치명적인 결과를 초래할 수 있습니다. 이번 글에서는 Galera Cluster가 이 문제를 어떻게 해결하는지 알아보겠습니다.

Lost Update 문제란?

Lost Update는 두 개 이상의 트랜잭션이 같은 레코드를 동시에 수정하려고 할 때 발생합니다. 한 트랜잭션의 변경 사항이 다른 트랜잭션에 의해 덮어씌워져 데이터 유실이 일어나는 현상입니다. 일반적으로 Repeatable Read 격리 수준을 사용하면 트랜잭션은 시작 시점의 데이터를 스냅샷으로 읽기 때문에 읽기 일관성은 보장되지만, 이 방식만으로는 쓰기 충돌(Lost Update)을 막을 수 없습니다.

전통적 MySQL InnoDB 환경에서의 문제

MySQL InnoDB는 row-level locking을 사용해 트랜잭션 간 충돌을 최소화하려 합니다. 그러나 트랜잭션 간 락이 해제된 후, 다른 트랜잭션이 이전 스냅샷의 데이터를 기반으로 업데이트를 수행하게 되면 여전히 Lost Update 문제가 발생할 수 있습니다.

Galera Cluster의 해결 전략

Galera Cluster는 이 문제를 근본적으로 해결하기 위해 두 가지 메커니즘을 제공합니다.

Snapshot Isolation과 First Committer Wins

Galera Cluster는 Snapshot Isolation을 지원하며, 트랜잭션 커밋 시점에 First Committer Wins 규칙을 적용합니다. 먼저 커밋을 시도한 트랜잭션이 성공하고, 이후 커밋을 시도하는 트랜잭션은 Certification 단계에서 충돌이 감지되어 롤백됩니다. 이를 통해 Lost Update뿐만 아니라 Dirty Write와 같은 다른 동시성 문제도 효과적으로 방지할 수 있습니다.

SELECT FOR UPDATE를 통한 사전 충돌 방지

추가적으로 Galera Cluster는 MySQL InnoDB의 SELECT FOR UPDATE 기능을 활용해 충돌을 사전에 방지합니다. SELECT FOR UPDATE는 데이터를 읽는 시점에 해당 레코드에 배타적 락(Exclusive Lock)을 걸어, 다른 트랜잭션이 동시에 해당 데이터를 수정하는 것을 차단합니다. 이로 인해 트랜잭션 간 선제적인 충돌 방지가 가능해지며, 더욱 견고한 데이터 일관성을 확보할 수 있습니다.

핵심 정리

Galera Cluster는 Snapshot IsolationFirst Committer Wins 메커니즘을 통해 Lost Update 문제를 근본적으로 차단합니다. 여기에 더해 SELECT FOR UPDATE를 통해 충돌을 사전에 예방하고, 애플리케이션 레벨에서도 정밀한 동시성 제어를 가능하게 합니다.

마치며

분산 데이터베이스 환경에서도 데이터 일관성과 무결성을 지키는 것은 필수적입니다. Galera Cluster는 트랜잭션 충돌을 사전에 방지하고, 발생 시 빠르게 감지하여 롤백하는 구조를 통해 시스템의 안정성과 성능을 동시에 만족시키는 신뢰할 수 있는 솔루션을 제공합니다.

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용