상세 컨텐츠

본문 제목

Chapter 7. Transaction(트랜잭션) - Part 1

Log.Develop/DDIA

by bluayer 2022. 6. 10. 10:38

본문

소개

본 글은 데이터 중심 어플리케이션(마틴 클레프만)으로 스터디하며 해당 책의 내용을 요약 정리한 내용입니다.

https://github.com/ddia-study/ddia-study

 

GitHub - ddia-study/ddia-study: 데이터 중심 어플리케이션 설계

데이터 중심 어플리케이션 설계. Contribute to ddia-study/ddia-study development by creating an account on GitHub.

github.com

 

서론

트랜잭션은 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법이다. (중략) 트랜잭션은 자연법칙이 아니다. 데이터베이스에 접속하는 애플리케이션에서 프로그래밍 모델을 단순화하려는 목적으로 만든 것이다.

 

ACID의 의미

ACID 표준을 따르지 않는 시스템을 BASE(Basically Available, Soft state, Eventual consistency)라고 부른다.

 

원자성(Atomicity)

원자성은 동시성과 관련이 없다.

원자성 없이는 여러 변경을 적용하는 도중 오류가 발생하면 어떤 변경은 효과가 있고 어떤 것은 그렇지 않은지 알기 어렵다.

abortability이 원자성보다 나은 단어같다고 한다.

 

일관성(Consistency)

데이터에 관한 어떤 선언(불변식(invariant))이 있다는 것이다.

예를 들어 회계 시스템에서 모든 계좌에 걸친 대변과 차변은 항상 맞아떨어져야 한다.

트랜잭션이 이런 불변식이 유효한 데이터베이스에서 시작하고 트랜잭션에서 실행된 모든 쓰기가 유효성을 보전한다면 불변식이 항상 만족한다고 확신할 수 있다.

 

격리성(Isolation)

대부분 동시에 여러 클라이언트에서 데이터베이스에 접속한다.

같은 데이터에 접근한다면?

격리성은 동시에 실행되는 서로 격리된다는 것을 의미하고, 트랜잭션은 다른 트랜잭션을 방해할 수 없다.

데이터베이스는 실제로는 여러 트랜잭션이 동시에 실행됐떠라도 트랜잭션이 커밋됐을 때의 결과가 트랜잭션이 순차적으로 실행됐을 때의 결과와 동일하도록 보장한다.

 

지속성(Durability)

지속성은 트랜잭션이 성공적으로 커밋됐다면 하드웨어 결함이 발생하거나 데이터베이스가 죽더라도 트랜잭션에서 기록한 모든 데이터는 손실되지 않는다는 보장이다.

지속성을 보장하려면 데이터베이스는 트랜잭션이 성공적으로 커밋됐다고 보고하기 전에 쓰기나 복제가 완료될 때까지 기다려야 한다.

 

단일 객체 연산과 다중 객체 연산

다중 객체 트랜잭션은 어떤 읽기 연산과 쓰기 연산이 동일한 트랜잭션 내에 속하는지 알아낼 수단이 있어야 한다.

비관계형 데이터베이스는 이런 식으로 연산을 묶는 방법이 없는 경우가 많다.

따라서 어떤 키에 대한 연산은 성공하고 나머지 키에 대한 연산은 실패해서 데이터베이스가 부분적으로 갱신된 상태가 될 수 있다.

 

단일 객체 쓰기

여러 클라이언트에서 동시에 같은 객체에 쓰려고 할 때 갱신 손실(lost update)을 방지하므로 유용하다.

 

다중 객체 트랜잭션의 필요성

많은 분산 데이터 스토어는 다중 객체 트랜잭션을 포기했지만, 근본적으로 트랜잭션을 막는 것은 아무것도 없다.

단일 객체 삽입, 갱신, 삭제만으로 충분한 사용 사례도 있지만, 여러 개의 다른 객체에 실행되는 쓰기 작업이 코디네이션 되어야 하는 상황도 있다.

 

오류와 어보트 처리

트랜잭션의 핵심 기능은 오류가 생기면 어보트되고 안전하게 재시도할 수 있다는 것이다.

하지만 모든 시스템이 그렇진 않기 때문에 오류 복구가 애플리케이션에게 책임이 있는 경우가 있다.

어보트된 트랜잭션을 재시도하는 것은 간단하고 효과적인 오류 처리 메커니즘이지만 완벽하지는 않다.

관련글 더보기

댓글 영역