본문 바로가기
Programming

[Database] 트랜잭션이란? (ACID 데이터베이스 속성)

by 개발자 염상진 2022. 5. 30.

 

 

 

트랜잭션(Transaction)이란?

 

트랜잭션은 데이터베이스를 구성하는데 아주 중요한 개념이다. 따라서 백엔드 개발자로 취업을 할때 면접 질문에 자주 등장하기도 하고, 실제 업무를 할 때도 반드시 알고 있어야 하는 개념이다. 

 

트랜잭션이란 여러개의 작업을 하나로 묶은 일련의 실행 유닛이다. 각 트랜잭션들은 특정 작업으로 지가해서 연결된 모든 작업을 완료해야 정상적으로 종료되게 된다. 만약 트랜잭션에 속한 여러 작업 중 하나의 작업이라도 실패하는 경우 모든 트랜잭션이 실패한 것으로 간주된다. 

 

데이터베이스에서 트랜잭션은 한 개 이상의 데이터베이스를 조작하는 논리적인 연산의 집합이 된다. 하나 이상의 SQL문을 포함하게 되고, 분해할 수 없는 최소 단위기 때문에 일반적으로 회복 작업의 기준 단위가 되기도 한다. 트랜잭션은 ACID 특성을 가지고 데이터의 안전성을 보장받게 된다.

 

 

트랜잭션 ACID

 

트랜잭션은 ACID 특성을 가지고 있다. 정보처리기사 공부할 때는 '원일고지'라고 외웠었는데, 유식하게 ACID 특성이라고 외우면 좋다.

 

① 원자성(Atomicitiy)

트랜잭션의 첫번째 특성인 원자성은 트랜잭션에 속한 모든 작업이 전부 성공하거나 전부 실패하여 결과를 예측할 수 있어야 한다. 하나의 단위로 묶인 트랜잭션의 특성상 업데이트가 일어나는 경우 누가 업데이트를 했는지 모르거나, 업데이트 정보가 누락되는 경우 데이터가 오염된다. 

 

예를 들어 계좌이체를 한다고 가정해보자. A 계좌에서 출금되고 B 계좌에서 입금되는게 일반적이지만 만약 B계좌에 입금이 되지 않았다면?  은행은 제기능을 못하는 것이다. 만약 위와 같은 경우가 발생하면 A계좌에서 출금한 사실도 취소가 되어야 할 것이다. 이게 바로 원자성이다.

 

원자성을 지키는 경우 A계좌에서 출금되었다고 하더라도 B 계좌에서 입금이 실패하면 A계좌 출금 사실도 취소가 된다. 묶여있는 일련의 실행 유닛 중 하나라도 실패하는 경우 모든 작업을 실패로 만들어버리는 것이다. SQL문을 활용한 데이터베이스에서도 특정 쿼리를 실행했지만 부분적으로 실패하는 경우 전부 실패하게 되어 있다. 

 

 

② 일관성(Consistency)

트랜잭션의 두번째 특성은 일관성이다. 하나의 트랜잭션 이전과 이후의 데이터베이스 상태는 이전과 같이 유효해야 한다는 성질이다. 즉, 트랜잭션이 이전과 이후 모두 데이터베이스 제약과 규칙을 만족해야 한다는 것이다. 

 

예를 들어 모든 user는 name을 가지고 있어야 한다고 가정하면 name이 없는 쿼리를 날리거나 기존 user의 name column을 삭제하는 경우 일관성을 위배하는 트랜잭션이 된다. 어떤 트랜잭션에서도 데이터의 일관성은 변하지 않아야 한다. 

 

③ 고립성(Isolation)

트랜잭션의 세번째 특성인 고립성은 모든 트랜잭션이 다른 트랜잭션으로 부터 독립되어야 한다는 성질이다. 동시에 여러개의 트랜잭션이 수행되는 경우 각 트랜잭션은 고립되어 있어서 연속적으로 실행된 것과 동일한 결과를 가질 수 있게 된다.

 

예를 들어 A계좌에서 B계좌로 만원을 송금하고, C계좌로도 만원을 송금하는 경우 B계좌에 송금한 뒤 C계좌에 송금한 것과 동일한 결과값을 가져야 한다. 고립성을 지킨다는 것은 트랜잭션의 독립성이 보장된다는 것이기에 다른 트랜잭션의 내용을 알 수 없다. 트랜잭션이 동시에 실행되는 경우와 연속으로 실행되는 경우 모드 데이터베이스의 상태가 동일해야 한다.

 

④ 지속성(Durability)

트랜잭션의 네번째 특성인 지속성은 하나의 트랜잭션이 성공적으로 수행되는 경우 해당 트랜잭션에 대한 로그가 남아야 한다는 성질이다. 만약 런타임 오류가 발생하는 경우에도 해당 기록은 영구적으로 기록되어야 한다.

 

예를 들어 계좌이체를 성공적으로 실행한 뒤 해당 은행 데이터베이스에 런타임 오류가 발생하더라도 계좌이체에 관한 내역은 영구적으로 기록되어야 한다. 만약 계좌이체에 관한 로그를 기록하기 전 런타임 오류가 발생하여 로그를 남기는데 실패하게 되면 해당 거래 내역은 실패로 간주되고 관련된 모든 트랜잭션은 취소되어야 한다. 

 

 

트랜잭션 상태 제어

 

트랜잭션 상태 제어란 트랜잭션의 흐름을 변경하는 것이 나닌 트랜잭션의 결과를 수용하거나 취소하는 것이다. 

 

① 트랜잭션 상태

  • 활동(Active) : 트랜잭션이 실행을 시작하거나 실행 중인 상태.
  • 부분완료(Partially Committed) : 트랜잭션이 마지막 연산을 마치고 데이터베이스에 실행 결과를 적용하기 직전의 상태.
  • 완료(Committed) : 트랜잭션이 연산을 마치고 연산의 결과를 데이터베이스에 적용한 상태. 트랜잭션이 성공적으로 완료 연산을 수행한 상태를 의미한다.
  • 실패(Failed) : 연산 실행 중 오류에 의해 더 이상 연산이 진행될 수 없는 상태.
  • 철회(Aborted) : 트랜잭션이 실패하여 트랜잭션 실행 전 상태로 복구(ROLLBACK) 된 상태. SAVEPOINT를 지정해서 복구할 위치를 지정할 수 있음.
  • 실행 취소(Undo) : 변경되었던 데이터를 취소하고 원래 내용으로 복귀
  • 다시 실행(Redo) : Undo로 복귀되었던 데이터를 원래 상태로 복원하는 작업. 갱신이 완료된 데이터를 로그 파일을 이용해 복원한다.

 

 

② COMMIT

변경 사항이 물리적인 디스크에 저장된다. COMMIT 이후에는 이전 상태로 복구가 불가능하다.

 

③ ROLLBACK

이미 수행된 모든 작업을 취소하고 원래 상태로 복구한다. 수행되고 있는 모든 작업은 메모리상에서 이뤄지기 때문에 복구가 가능하다.

 

④ SAVEPOINT

트랜잭션의 규모가 너무 크거나 복잡할 경우 처음부터 다시 실행하는 것이 아니라 특정 지점을 정의해 해당 지점부터 다시 시작할 수 있도록 SAVEPOINT를 잡는다. 여러개의 SAVEPOINT를 잡는다.

 

 

트랜잭션 활용

 

데이터베이스 내에서 수행되는 트랜잭션은 ACID를 통해 안전성을 보장받을 수 있다. 또한 트랜잭션을 분석해서 데이터베이스를 활용할 수 있다.

 

① 용량 산정의 근거 자료로 활용 

생성 트랜잭션을 분석해서 테이블에 저장도는 데이터 양을 유추할 수 있다. 또한 이를 근거로 데이터베이스의 용량을 산정하는데 사용할 수 있다. 

 

② 디스크 구성의 기초 자료로 활용

트랜잭션 분석 결과를 활용해서 프로세스가 과도하게 발생하는 테이블에 대해 여러 디스크에 분산 배치하여 디스크의 입출력을 분산시켜 성능을 향상시키는데 활용할 수 있다.

 

③ 데이터베이스 연결 채널의 분산에 활용

특정 채널에 집중되는 트랜잭션을 분산시켜 대기현상, TIME-OUT 현상을 방지할 수 있다.

 

 

 

 

[Database] SQL이란?

SQL이란? SQL(Structured Query Language)는 구조화된 Query언어다. Query언어란 직연하자면 질의문을 의미한다. 구글이나 네이버에서 검색을 치는 행위가 query문이다. 구글이나 네이버 데이터베이스에 저장

about-tech.tistory.com

 

 

[Web Server] fetch API 사용하는 방법

fetch API 사용하는 방법 fetch는 프론트에서 서버로 리소스를 요청하기 위해서 Javascript에 내장된 Promise 함수다. 기본적으로 비동기 태생을 지닌 녀석이기 때문에 Javascript가 아닌 Node.js나 웹 브라우

about-tech.tistory.com

 

 

[Algorithm] 바코드 문제 DFS 알고리즘 기초 Javascript

문제 1,2,3 으로만 구성된 수열 바코드를 생성해야 한다. 무조건 1,2,3만 붙여서 바코드를 만들면 쉽겠지만, 조건이 붙어있다. 바코드에서 인접한 두개의 부분 수열이 동일한 경우 바코드로 제작할

about-tech.tistory.com

 

댓글