트랜잭션(transaction)은 논리적으로 단일한 작업을 얘기한다. 또는 여러 쿼리들의 집합이라고도 할 수 있다.
컴퓨터 과학에서 ACID는 어떠한 장애, 에러가 나더라도 데이터의 유효성을 보장해주는 트랜잭션의 성질을 말한다.
한국어로 직역하면 원자성이다. 위키백과에서 원자를 다음과 같이 정의한다.
원자(原子, atom)는 일상적인 물질을 이루는 가장 작은 단위이다.
https://ko.wikipedia.org/wiki/%EC%9B%90%EC%9E%90#:~:text=%EC%9B%90%EC%9E%90(%E5%8E%9F%E5%AD%90%2C%20atom)%EB%8A%94,%EA%B0%80%20%EC%A0%84%EB%B6%80%20%EC%9B%90%EC%9E%90%EB%A1%9C%20%EC%9D%B4%EB%A3%A8%EC%96%B4%EC%A0%B8%20%EC%9E%88%EB%8B%A4.
그러나, 이렇게만 알면 오히려 더 헷갈린다. 조금 더 어원을 찾아가보면 이 'Atomocity'는 atomos 즉, '더 이상 나눌수 없는'이란 뜻을 가진 그리스어에서 나왔다는것을 알 수 있다.
흔히 입금으로 예시를 가장 많이 든다. A라는 사람이 B의 계좌에 돈을 입금한다고 하자.
A 계좌: 10,000원 -> 0원(-10,000)
B의 계좌: 1,000,000,000원 -> 1,000,010,000(+10,000)
A가 10,000원을 입금하는 상황이다. A입장에서는 피같은 전재산 10,000원을 B에게 주는 상황이다. A는 울며겨자먹기로 만원을 B 계좌로 입금하였다. 그러나, 일종의 전산 시스템 오류가 나서 A계좌에서 만원이 빠져나갔지만 B의 계좌에는 돈이 입금이 안되었다. A의 입장에선 화가 머리 끝까지 나는 경우가 되어 버린다.
A의 계좌에서 만원이 빠져나갔으면 B의 계좌에는 반드시 그 만원이 플러스되어야 한다. 이 일련의 작업이 나누어지면 안된다는 뜻이다. 이렇게 트랜잭션은 원자성을 가져야 한다.
A + B = 100 이어야 한다는 제약을 걸었다고 가정하자. 만약, B엔 아무런 변화를 가하지않고 A의 값에 -10을 한다고 하자. A + b = 90이 되어버린다. 이 전체의 제약이 깨지게 된다. DBMS에서 transaction에서는 이러한 제약조건에 위반하는 데이터가 나오지 않게 하기 위해 roll back을 시킨다. 즉 어떤 트랜잭션이던 일관성(Consistency)을 가져야 한다.
두 트랜잭션(T1, T2)가 발생한다고 했을 때, T1에서 데이터의 변화가 일어날지라도 T2에서 데이터를 읽거나 쓸 때 T1에서 발생한 데이터의 변화를 모른다. 그렇게 되면 그 변화가 일어나지 않았던 일처럼 생겨버릴 수가 있다. 이 문제를 해결하기 위해 isolation을 적용할 수 있다.
그러나, 이 isolation을 엄격하게 적용하면 성능의 저하가 발생할 수도 있기 때문에 사용자정의를 할 수 있게 dbms에서는 isolation level을 지정해 줄 수 있다.
내구성이다. commit이 된 트랜잭션은 영구적으로 디스크에 저장이 되어야 한다. commit이 된 트랜잭션 작업은 roll back을 할 수 없다는 의미가 된다.