4.3 비격리 문제 처리
ACID의 격리성(I)은 동시에 실행 중인 여러 트랜잭션의 결과가 어떤 순서대로 실행된 결과와 동일함을 보장하는 속성입니다. 그래서 각 ACID 트랜잭션이 DB 데이터에 배타적으로 접근하듯이 동작하고, 개발자는 동시 실행되는 비즈니스 로직을 쉽게 작성할 수 있습니다.
그런데 사가는 바로 격리성이 빠져 있습니다. 실제로 사가의 한 트랜잭션이 커밋한 변경분을 다른 사가가 즉시 바라볼 수 있습니다. 이는 두 가지 문제를 야기합니다. 첫째, 한 사가가 실행 중에 접근하는 데이터를 도중에 다른 사가가 바꿔치기할 수 있습니다. 둘째, 한 사가가 업데이트를 하기 이전 데이터를 다른 사가가 읽을 수 있어서 데이터 일관성이 깨질 수 있습니다. 사가는 사실 ACD 트랜잭션으로 보아야 합니다.
• 원자성(Atomicity): 사가는 트랜잭션을 모두 완료하거나 모든 변경분을 언두해야 합니다.
• 일관성(Consistency): 서비스 내부의 참조 무결성(referential integrity)은 로컬 DB가, 여러 서비스에 걸친 참조 무결성은 서비스가 처리합니다.
• 지속성(Durability): 로컬 DB로 처리합니다.
격리가 안 되면 DB 용어로 비정상(anomaly)이 나타날 가능성이 있습니다. 트랜잭션이 차례대로 실행되지 않는 것처럼 데이터를 읽고 쓰게 되는 현상입니다. 그래서 사가를 동시 실행한 결과와 순차 실행한 결과가 달라질 수 있습니다.
일견 비격리는 도저히 용납되지 못할 문제처럼 보이지만, 실제로 성능 향상을 위해 격리 수준을 낮추어 개발하는 경우가 흔합니다. RDBMS는 격리 수준을 트랜잭션마다 다르게 지정할 수 있고,10 기본적으로 완전 격리(full isolation)보다 약한 격리 수준을 적용합니다.11 그러나 실무에서는 교과서에 나오는 ACID 트랜잭션과 다른 DB 트랜잭션을 사용할 때가 많습니다.
11 역주 : 격리 수준(고립화 수준이라고도 함)은 Read Uncommitted, Read Committed, Repeatable Read, serializable 순서로 읽기 일관성이 점점 완전해집니다. 국내 대기업에서 많이 사용하는 오라클 DB의 기본 격리 수준은 Read Committed입니다.