DB에서의 트랜잭션은 하나의 기능을 하기 위한 여러 개의 작은 작업의 집합을 말한다. 많이들 예로 드는 A에서 B로의 계좌 이체를 보면, 계좌 이체
라는 트랜잭션은 아래 작업으로 나눌 수 있다.
그리고 트랜잭션은 ACID라는 트랜잭션이 안전하게 수행되는 것을 보장하는 성질이 있다. ACID는 Atomicity, Consistency, Isolation, Durability의 앞 글자를 따서 만든 것으로 각각 이런 의미를 가지고 있다.
ACID를 찾아 본 사람이라면 잊을 수 없다. 어떤 사람은 All or nothing
이라는 말이 여기서 나왔다고 하는데, 그건 알 수 없고(찾아보지 않았고) 어쨌든 All or nothing이다.
그 말은 위에서 트랜잭션을 말하면서 예로 든 계좌 이체를 구성하는 세 가지 개별 작업이 모두 성공적으로 수행되거나 하나도 수행되지 않거나 둘 중 하나라는 얘기다. 다시 말하면 A 계좌의 잔액을 차감
만 하고 (어떤 이유에서든) B 계좌의 잔액을 업데이트하지 않은채
트랜잭션을 끝내 commit 해 버리면 안된다는 것.
원자성은 ACID의 다른 성질에 비해 비교적 이해하기가 쉽다. 그리고 앞글자여서 외우기도 쉽다.
일관성은 여기저기 찾아보고 사람들이 열심히 설명을 한 것을 봐도 잘 이해가 안됐다. 솔직히 일관성을 지금도 100% 이해하는지 잘 모르겠다.
보통 하는 얘기들은 트랜잭션이 시작되기 전과 끝난 후의 데이터베이스의 상태가 일관적
이라는 것이다. 그리고 유효해야 한다
라는 얘기도 있다. 일관적
이라는 것이 제약이나 규칙을 만족
하는 것이라는데 솔직히 잘 이해가 안되고요.
그냥 DB에 설정된 제약, 정확히는 Table에 설정된 제약, 예를 들면 어떤 컬럼은 숫자만 들어가야 한다거나, 공백을 허용하지 않는다는가 하는 제약을 지키지 않는 트랜잭션은 수행을 하지 않는다는 얘기같다.
또 어떤 설명에서는 일관성
은 DB의 책임이 아닌 Application의 책임이라고도 한다. 이 얘기도 틀린 얘기같지는 않다, 사실 개발자의 입장에서는 DB를 Application 없이 단독으로 사용하지 않기 때문에 트랜잭션의 일관성을 Application 레벨에서 지킬 수 있게 한다면 저 얘기도 맞는 것 같다.
어쨌든 일관성의 예로 들만한 것은 이런 것이 있다.
모든 트랜잭션은 격리된 상태에서 독립적으로 수행되어야 한다. 그래도 여러 개의 트랜잭션이 동시에 수행되더라도 연속으로 실행한 것과 동일한 결과가 나와야 한다.
보통의 상황에서 DB는 하나의 클라이언트에서 한 번에 하나씩의 요청만 처리하는 것이 아니다. 여러 클라이언트가 동시에 접속을 시도하고 이 때 동시성 문제(경쟁조건)가 발생한다.
예를 들어 위 그림과 같이 두 클라이언트가 하나의 DB에 동시에 접속해 카운트를 1만큼 증가하려고 할 때, User 1이 42에서 43으로 증가시키고 커밋하기 전에 User 2가 조회한 결과인 42를 1 증가해 커밋하면 기대한 44가 아닌 43이 최종 결과가 된다.
이것도 일관성과 비슷하게 무슨 얘기인지 정확히 잘 몰랐지만, Data가 일단 저장되면 손실될 염려가 없어야 한다는 것으로 이해했다. 더불어 AWS의 Multi AZ와 같이 여러 위치에 분산 저장하는 DB라면 다른 위치의 DB에도 동일한 변경 내용이 저장되는 것, 그리고 Master-Slave라면 M과 S 모두에 동일한 내용이 업데이트 되는 것도 지속성과 관련이 있다.
이해가 잘 안됐던 이유는 소프트웨어적인 내용이 아닌 하드웨어에 가까운 내용이라고 생각해서 였지만 그것도 결국 DB의 트랜잭션에 안전성을 제공하기 위한 요소라는 것으로 이해하기로 했다.