주요 컨텐츠로 이동

ACID 트랜잭션

Databricks 무료로 시작하기

트랜잭션이란 무엇입니까?

데이터베이스와 데이터 스토리지 시스템이라는 맥락에서 트랜잭션이란 한 단위의 작업으로 취급되는 모든 작업을 말합니다. 트랜잭션은 완전히 완료되기도 하고 전혀 완료되지 않을 수도 있으며, 스토리지 시스템을 한결같은 상태로 둡니다. 트랜잭션의 전형적인 예는 은행 계좌에서 현금을 인출할 때 일어나는 일입니다. 현금이 계좌에서 인출되거나, 인출되지 않거나 둘 중의 하나일 뿐 그 중간 어딘가의 상태란 없습니다. 

A.C.I.D. 속성: 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 영속성(Durability)

ACID는 트랜잭션을 정의하는 4가지 중대한 속성을 가리키는 약어입니다. 즉 원자성(Atomicity), 일관성(Consistency), 신뢰성(Reliability), 격리(Isolation) 그리고 영속성(Durability)을 의미합니다. 데이터베이스 작업에 이러한 ACID 속성이 있다면 이를 ACID 트랜잭션이라 부르면 되고, 이런 작업을 적용하는 데이터 스토리지 시스템을 트랜잭션 시스템이라고 합니다. ACID 트랜잭션은 한 테이블의 읽기, 쓰기 또는 수정 작업이 각각 다음과 같은 속성을 가지고 있다고 보장해줍니다.

  • 원자성(Atomicity) - 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭제하기 위함)을 하나의 단위로 취급합니다. 문 전체를 실행하거나 그 문의 어떤 부분도 실행하지 않거나 둘 중 하나입니다. 이 속성이 있으면 예컨대 스트리밍 데이터 소스가 스트리밍 중에 갑자기 오류를 일으키더라도 데이터 손실과 손상이 방지됩니다.
  • 일관성(Consistency) - 트랜잭션이 테이블에 변경 사항을 적용할 때 미리 정의된, 예측할 수 있는 방식만 취합니다. 트랜잭션 일관성이 확보되면 데이터 손상이나 오류 때문에 테이블 무결성에 의도치 않은 결과가 생기지 않습니다.
  • 격리(Isolation) - 여러 사용자가 같은 테이블에서 모두 동시에 읽고 쓰기 작업을 할 때, 각각의 트랜잭션을 격리하면 동시 트랜잭션이 서로 방해하거나 영향을 미치지 않습니다. 각각의 요청이 실제로는 모두 동시에 발생하더라도, 마치 하나씩 발생하는 것처럼 발생할 수 있습니다.
  • 영속성(Durability) - 트랜잭션 실행으로 인해 데이터에 적용된 변경 사항이 저장되도록 보장합니다. 시스템 오류가 발생해도 마찬가지입니다.

ACID 트랜잭션이 있으면 좋은 이유는 무엇입니까?

ACID 트랜잭션은 가능한 최대한의 데이터 안정성과 무결성을 보장해줍니다. 작업 하나가 일부분만 완료되는 바람에 데이터가 일관적이지 않은 상태가 되는 불상사가 절대로 일어나지 않게 해준다는 뜻입니다. 예를 들어 ACID 트랜잭션이 없다고 가정하면, 데이터베이스 테이블에 몇몇 데이터를 쓰던 중에 예기치 못하게 정전이 되면 데이터 중 일부는 저장이 되고 일부는 저장되지 않는 사태가 발생할 수 있습니다. 그러면 데이터베이스는 일관성 없는 상태가 되어 복구하기 무척 어렵고 시간도 오래 걸립니다.

Delta Lake: ACID 트랜잭션을 보장하는 안정적이고 일관된 데이터

Delta Lake 로고

ACID 트랜잭션이 데이터 웨어하우스 분야의 선망 대상으로 자리 잡은 것은 오래전의 일이지만, 이제는 Delta Lake 덕분에 데이터 레이크 분야에도 ACID 트랜잭션을 도입할 수 있게 되었습니다. 이 기술 덕분에 테이블에 실시간으로 새 데이터를 쓰는 와중에도 사용자는 데이터를 일관되게 조회할 수 있습니다. 각각의 쓰기 작업이 순서가 지정된 트랜잭션 로그에 기록되는 격리된 트랜잭션이기 때문입니다. [Delta Lake는 가능한 가장 높은 수준의 격리를 사용하여(직렬화할 수 있는 격리) 한 테이블을 대상으로 한 읽기와 쓰기의 일관성과 안정성을 보장합니다.] Delta Lake는 ACID 트랜잭션을 구현하여 이전에 언급된 Lambda 아키텍처의 단점 여러 개를 효과적으로 해결합니다. Lambda 아키텍처는 복잡하고 데이터를 잘못 조회하며 Lambda 파이프라인 이후 필요한 재처리는 불가피하게 중단되는 단점이 있습니다. 사용자가 자신의 데이터에서 동시 트랜잭션을 여러 개 수행할 수 있고, 데이터 소스나 스트림에 오류가 발생하는 경우 Delta Lake가 트랜잭션 실행을 취소하여 데이터를 문제없이 멀쩡한 상태로 유지합니다. ACID 트랜잭션의 뛰어난 장점은 사용자가 Delta Lake에 저장된 데이터를 신뢰할 수 있게 해준다는 데 있습니다. 데이터 애널리스트가 데이터에서 ETL을 수행하여 대시보딩을 준비할 때 Delta Lake 테이블을 활용하면 자기 눈에 보이는 KPI가 데이터의 실제 상태를 그대로 나타낸다는 사실을 믿어도 됩니다. 머신 러닝 엔지니어가 Delta Lake 테이블을 사용하여 기능 엔지니어링을 수행한다면, 변환이나 집계가 모두 정확히 의도한 대로 실행되거나 아예 실행되지 않거나(이 경우 엔지니어에게 알림이 감) 둘 중 하나일 것을 100% 확신해도 됩니다. 내 머릿속에 그려진 데이터 모델이 실제 데이터의 진짜 기본 상태를 고스란히 반영한다는 사실을 알고 있다는 것은 값을 매기기 어려울 정도로 귀중한 가치가 있는 장점입니다.

추가 자료

용어집으로 돌아가기