원자성(Atomicity)이란

원자성은 원칙적으로 “중간 상태가 노출되지 않고, 작업 전체가 한 덩어리로 성공하거나 아예 실행되지 않는 성질”을 의미한다.

원자성 하면 바로 떠오르는, 데이터베이스에서 두 계좌 간 이체를 생각해보자.

  1. 계좌 A에서 출금
  2. 계좌 B에 입금

이 두 단계 중 하나라도 실패하면, 이체 전체가 취소되어야 한다. 그렇지 않으면 A에서만 돈이 빠지고 B엔 입금되지 않는 상황이 벌어질 수 있다.

즉 “모두 실행됨 or 모두 실행되지 않음(all-or-nothing)”이 원자성의 핵심이다.

왜 원자성이 중요한가

동시성 환경에서 여러 스레드나 서버가 같은 자원에 접근해서 작업을 나누어 수행할 때, 중간 단계가 다른 작업에 의해 관여되면 시스템 상태가 엉켜버린다.

원자성이 보장되지 않으면 다음과 같은 문제가 생긴다.

트랜잭션만으로는 원자성이 완전하지 않다

여기서 중요한 건, 트랜잭션은 한 요청 내부”의 원자성만 보장할 뿐, 여러 서버에서 동시에 들어오는 요청끼리는 보호하지 못한다.

즉, 트랜잭션이 있음에도, 동일한 원자적 흐름을 이탈시키는 흔한 원인은 레이스 컨디션 + 다중 서버 환경이다. 그래서 이 우테코 페어 매칭 프로젝트에서는 본래 원자성을 보장하기 위해 락 + 트랜잭션을 같이 사용해야 한다.

나는 실험을 위해서 LockingStrategy 아키텍처를 사용하여 다중서버에서 원자성이 깨지는 전략, 보장하는 전략 등을 사용할 수 있도록 구현해보려 한다.