0. 트랜잭션이란? / 트랜잭션의 4대 특징 ACID란?
트랜잭션이란 DBMS (DB) 에서 데이터에 대한 하나의 논리적 실행단계를 의미한다. 여기서 트랜잭션의 4대 특징이란 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질으로, ACID (Atomicity[원자성] / Consistency[일관성] / Isolation[고립성] / Durability[지속성])로 표현된다. 은행과 같이 트랜잭션의 수행이 안전하게 수행됨을 보장해야 하는 시스템에 주로 사용되며, 각 특성들은 다음과 같은 의미를 갖는다.
1. Atomicity(원자성)
원자성은 마치 원자와 같이 데이터 베이스 연산들이 나눌 수도, 줄일 수 없는 하나의 유닛으로써 취급됨을 의미하는데, 모든 연산이 완전하게 적용되거나 아무것도 적용되지 않음을 보장하는 특성이다.(All or Nothing)
예를 들어 은행에서 A가 B에게 송금을 하는 과정에서 오류가 발생하였다고 가정했을 때, A에게서는 돈이 빠져나갔지만 B에게는 돈이 들어오지 않는다면 큰 문제를 야기할 수 있지만 원자성이 보장되어 송금 자체가 취소된다면 이러한 혼란을 방지할 수 있다.
이처럼 트랜잭션은 원자성을 보장함으로써 부분적으로 데이터베이스가 업데이트되어 모든 연산을 취소하는 것보다 더 큰 문제를 야기하는 것을 방지해준다.
2. Consistency(일관성)
일관성은 데이터베이스의 트랜잭션이 제약조건, cascades, triggers를 포함한 정의된 모든 조건에 맞게 데이터의 값이 변경됨을 의미한다. 일관성이 프로그래머가 의도한 연산들에 대해 오류가 없음을 보장하지는 못하지만 사전에 정의한 조건과 맞지 않는 데이터의 변경으로 인해 오류가 발생하지 않음을 보장해주는 것이다. 예를 들어, 데이터 베이스에 CUD 연산을 진행하였을 때 스키마와 제약조건과 같이 사전에 설정한 룰에 맞지 않는 데이터가 들어가는 것을 방지해줄 수 있다. 이와 같이 트랜잭션의 일관성은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
트랜잭션에서 일관성의 필요성에 대한 개인적인 견해는 다음과 같다. (틀리다면 지적 부탁드립니다)
어플리케이션 단에서 데이터에 대해 스키마, 제약 조건 등을 완벽히 일관성을 지켜줄 수 있는 서비스를 제공할 수 있으나, 데이터 베이스에서 일관성을 보장해준다면 프로그래밍의 난이도를 크게 줄여줄 수 있으며, 어플리케이션에서 DBMS으로의 전달 과정에서의 오류와 해커의 공격 등 어플리케이션이 미쳐 보장해주지 못하는 일관성을 DBMS에서 보장해줄 수 있을 것이다.
일관성을 보장해주지 못해 데이터를 제약조건에 맞지 않는 데이터가 입력된다면 외래키가 기본키를 참조하는 과정에서 참조 오류가 생길 수도 있고, 제한된 조건을 넘는 데이터를 의도적으로 입력하여 메모리를 덮어쓰는 버퍼 오버플로우 공격에 취약하는 등 오류와 공격에 취약해질 것이다.
정리하자면 개인적인 견해로는 트랜잭션이 일관성 특성을 가짐으로써 프로그래밍 난이도를 낮춰주고, 해커의 공격을 방지해주며, 데이터를 일관성있고 안전하게 제공해줄 수 있을 것으로 예상된다.
3. Isolation (독립성)
트랜잭션의 독립성은 DBMS에서 데이터의 무결성을 결정하는 특성이다. DBMS에서 다수의 유저들이 같은 시간에 같은 데이터에 접근하였을 때 수행중인 트랜잭션이 완료될 때 까지 다른 트랜잭션의 요청을 막음으로써 업데이트가 누락되는 등, 데이터가 꼬이는 것을 방지해줄 수 있는 것이다.
이 독립성이 없다면 복수의 사용자에 의해 dirty reads이나 lost updates이 발생할 것이다. 독립성은 Isolation Level으로 설정될 수 있는데, 레벨이 높다면 이러한 동시 작업에 대한 독립성이 높아지지만 시스템 자원이 많이 필요할 것이다. 반대로 레벨이 낮다면 독립성이 낮아지지만 시스템 자원이 반대로 적게 필요할 것이다.
독립성의 적용에 대한 개인적인 견해는 다음과 같다.
이 독립성의 레벨은 시스템마다 다르게 설정되어야 할 것 같다. 은행과 쇼핑몰과 같은 작업이 비교적 적고, 연산의 중요도가 높은 시스템에서는 이 레벨이 높아야 할 것이고, IoT의 데이터 베이스와 같이 작업이 많고 연산의 중요도가 낮은 시스템이라면 이 레벨이 낮아야 할 것으로 추측된다.
4. Durability (지속성)
지속성은 커밋된 연산이 영구적으로 지속됨을 보장하는 속성이다. 즉, 시스템 문제 등으로 인해 오류가 발생하더라도 구행된 트랜잭션이 영원히 반영되어야 한다는 것이다. 지속성은 로그를 이용하여 구현되는데, 커밋의 성능을 위해 지속성이 일부분 포기 되는 방식도 존재한다.
- References
https://en.wikipedia.org/wiki/Database_transaction (wikipedia/Database transaction)
https://ko.wikipedia.org/wiki/ACID (wikipedia/ACID)
https://en.wikipedia.org/wiki/ACID (wikipedia/ACID)
https://en.wikipedia.org/wiki/Atomicity_(database_systems) (wikipedia/Atomicity)
https://en.wikipedia.org/wiki/Consistency_(database_systems )(wikipedia/Consistency)
https://en.wikipedia.org/wiki/Isolation_(database_systems) (wikipedia/Isolation)
https://en.wikipedia.org/wiki/Durability_(database_systems) (wikipedia/Durability)
https://d2.naver.com/helloworld/407507 (naver / DBMS는 어떻게 트랜잭션을 관리할까?)
숭실대학교 소프트웨어학부 : Database (2150013203) / 7강
'학교 공부 > 데이터베이스' 카테고리의 다른 글
DynamicSQL와 StaticSQL의 차이 (0) | 2021.05.05 |
---|---|
오라클의 조인 타입 / 표준 조인과 비표준 조인의 차이점 (0) | 2021.05.05 |
DB 인덱스와 Join (0) | 2021.04.15 |
RDBMS의 연산과 키 (0) | 2021.04.15 |
RDBMS의 정의, 외래키, 스키마 정의 (0) | 2021.04.14 |