더북(TheBook)

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입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.