[Database] Transaction / ACID

etc 2017. 12. 10. 15:00

<트랜잭션의 정의>

논리적인 수행단계를 의미힌다. 내부적으로는 여러개의 연산단계로 구현된다.


<트랜잭션의 필요성>

여러개의 request가 동시에 처리되거나, 시스템 문제가 발생하더라도 데이터를 안전하게 관리하기 위해서 트랜잭션은 필요하다

트랜잭션의 안전성을 보장하기 위해서, ACID라는 개념을 소개한다


<ACID의 정의>

ACID는 트랜잭션을 안전하게 수행하기 위해서 지켜져야 하는 성질들이다

Atomicity(원자성) / Consistency(일관성) / Isolation(고립성) / Durability(지속성)


<Atomicity>

Atomicity는 concurrent computing에도 등장하는 개념으로, "All or none"을 의미한다

트랜잭션이 성공했을 경우에는 All, 트랜잭션이 처음부터 실패했을 경우에는 none에 해당한다

하지만 트랜잭션은 여러개의 연산단계로 이루어져있으므로, 연산 도중에 실패할수도 있다

트랜잭션이 "도중에 실패"했을 경우, 일부 연산결과만 반영하면 처리가 꼬이게된다

그러므로 연산결과를 rollback함으로써 none으로 처리되게 하는 것이다

결론적으로 트랜잭션을 안전하게 처리하기 위해서는 Atomicity가 지켜져야한다


<Consistency>
여기서는 대표적으로 Constraint를 이야기할 수 있다

트랜잭션은 처리된 후에도 Constraint를 깨지지 않아야한다

데이터의 Constraint가 깨지지 않는다는 것은 데이터가 일관성있게 유지된다는 의미로 이해할 수 있다

데이터의 일관성 또한 트랜잭션의 안전한 처리가 목적이다


<Isolation>
트랜잭션들은 서로 간섭받지 않아야한다

각각의 트랜잭션들은 고립되어, 다른 트랜잭션들의 영향을 받지 않아야한다

이렇게 트랜잭션 각각이 고립됨으로써 트랜잭션을 안전하게 처리할 수 있다


<Durability>

트랜잭션이 성공적으로 처리되었다면, 이후에 시스템에 문제가 발생하더라도 로그 등을 통해 복구됨으로써

지속적으로(영구적으로) 처리내용이 반영되어야 한다


<결론>

트랜잭션은 논리적 수행단계를 의미하며, ACID는 트랜잭션을 안전하게 처리하기 위해서 지켜져야하는 성질들이다

추상적이어서 이해가 잘 되지않으므로, 글로 다시한번 정리하였다


------------------------------------------------------------------------------------------------------------


<old post>


DB는 Query 실행을, Query 단위가 아니라 Transaction 단위로 DB에 update(갱신)한다

즉 Query의 성공(commit)/실패(rollback) 또한 transaction 단위로 결정된다

Transaction의 목적/효과는 무엇일까?


<Transaction의 목적?>

Transaction을 통해 Query가 일부만 성공하거나 실패하는 것을 막을 수 있다

즉, Query의 성공과 실패가 분명해진다

성공하면 COMMIT하고 실패하면 ROLLBACK한다


Transaction은 Query들을 한꺼번에 실행하는데, 이것을 통해 Transaction간의 독립성을 보장한다

 Transaction끼리는 간섭받지 않는다


---


Transaction은 ACID를 보장하기 위한 수단이라고도 이야기한다


ACID 중 Atomicity(원자성)와 Isolation(고립성)만 살펴보자


Isolation부터 살펴보는 게 순서상 더 쉽다

이것은 여러개의 Transaction들이 서로 고립되어있다는 의미로, 다른 Transaction들의 상태를 고려하지 않아도 된다

비유하면 process들이 각자 고유한 영역을 가지는 것과 비슷하다


Atomicity은 concurrent processing에도 나오는 개념이다

DB Server에 Transaction이 여러개가 동시에 들어왔다고 가정하자

Transaction의 입장에서 DB의 record들은 공유 데이터이므로, Transaction들의 Query들이 서로 섞이게 되면

기대하지 않은 결과가 나올 수 있다. Atomic은 이러한 이슈를 발생하지 않게해준다

즉, DB Server에 Transaction request 여러 개가 동시에 들어온다 하더라도 Transaction은 하나씩 처리된다는 것이 Atomicity이다


ACID에 대한 자세한 내용은 아래참고

https://ko.wikipedia.org/wiki/ACID


---


병렬 컴퓨팅에서의 Consistency는, shared memory를 사용할 때 memory에 대한 consistency를 의미하는데,

이후에 추가하겠다


WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/