[Database] 트랜잭션(Transaction)과 ACID

배석재·2021년 3월 3일
0

Database

목록 보기
3/5
post-custom-banner

안녕하세요. 이번 포스팅에선 트랙젝션에 대하여 다뤄보려합니다!


데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.

이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.

어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.

출처) 위키백과

다음과 같이 설명되고 있는데, 해당 내용만 봐서는 이해가 안되는것 같아서 다시 정리해보겠습니다!

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.
이러한 과정을 통해 안정성을 확보할 수 있게 됩니다!

가령 예를 들어,

  1. A은행에서 출금하여 B은행으로 송금
  2. 알 수 없는 오류로 인하여 출금은 되었지만 송금은 불가
  3. 이러한 상황 발생시 출금 취소를 하거나 출금 된 금액만큼 송금

으로 진행할 수 있지만, 3번의 상황에서 어떠한 오류가 또 발생할 지 모르기 때문에 더 악화된 상황을 발생시킬 수 있습니다!
그래서 위의 상황을 트랜잭션을 사용하여 처리하면

  1. 트랙잭션 시작
  2. A은행에서 출금하여 B은행으로 송금
  3. 알 수 없는 오류로 인하여 출금은 되었지만 송금은 불가
  4. 롤백을 통하여 트랜잭션 이전 상황으로 되돌리기
  5. 커밋으로 트랜잭션 종료

이렇게 처리한다면 작업 중간에 오류가 발생한다 하더라도 아예 초기 상황으로 되돌리기 때문에 데이터에 대한 안정성을 확보할 수 있습니다!

좀 더 이해하게 쉽게 그림으로 표현된 내용을 가져왔습니다!


특징

트랜잭션에는 4가지 특성이 있습니다!
각 특성의 앞글자를 따서 ACID라고 칭하며 아래와 같이 정리할 수 있습니다.

  1. Atomicity (원자성)
    - 트랜잭션의 작업 내용이 데이터베이스에 모두 반영되거나, 아예 반영되지 않아야 합니다.
    - 즉, 작업 단위를 일부분만 실행하지 않는다는 것을 의미합니다.

  2. Consistency (일관성)
    - 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야 합니다.
    - 일관적인 DB상태라 함은, Datatype이 변하지 않는것 등의 상태 변화가 일어나지 않는것을 의미합니다.

  3. Isolation (격리성)
    - 하나의 트랜잭션 작업이 수행 시 다른 트랜잭션 작업이 중간에 수행될 수 없습니다.
    - 즉, 트랜잭션 작업 사이의 간섭이 있어선 안되고, 서로 간섭할 수 없습니다.

  4. Durability (지속성)
    - 트랜잭션이 성공적으로 완료되면 수행된 트랜잭션은 영원히 반영이 됩니다.
    - commit을 통하여 트랜잭션 작업 내용을 완료할 수 있습니다.


상태

아래의 그림은 트랜잭션의 상태에 관한 로직입니다!

활동(Active) : 트랜잭션이 실행 중인 상태입니다.
실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태입니다.
철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태입니다.
부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태입니다.
완료(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태입니다.

라고 설명할 수 있습니다!

Commit

  1. 커밋(commit) 연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것입니다.
  2. 커밋을 수행하면 하나의 트랜잭션 과정을 종료하게 됩니다.
  3. 커밋을 수행하면 이전 데이터가 완전히 업데이트됩니다.

위의 그림에서 첫 번째 커밋 후 그 뒤에 Update 문으로 데이터를 갱신하고 Delete 문으로 데이터를 삭제한 후 Insert 문을 사용해 데이터를 삽입하게 됩니다.
만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행하게 됩니다!

Rollback

  1. 롤백(rollback) 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어입니다.
  2. 이 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성(Atomicity)을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소한다는 특징이 있습니다.
  3. 트랜잭션이 시작되기 이전의 상태로 되돌린다.
  4. 즉, 마지막 커밋을 완료한 시점으로 다시 돌아게 되고, 커밋하여 저장한 것만 복구한다.
  5. 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기하게 됩니다.

위의 그림에서 롤백 명령은 마지막으로 수행한 커밋 명령까지만 정상 처리된 상태로 유지하게 됩니다.
그 이후에 수행했던 모든 DML(Data Manipulation Language) 명령어 작업들을 취소시켜 이전 상태로 원상 복귀 시키게 됩니다!
트랜잭션은 이렇듯 all or nothing(모든 것을 수행하던지 아무것도 하지 말던지) 방식으로 DML 명령어들을 처리한다.

Savepoint

  1. 세이브포인트(save point)는 '임시저장' 또는 '부분저장'과 같은 맥락으로 이해할 수 있습니다.
  2. 보통 롤백을 명시하면 삽입, 삭제, 업데이트 등의 작업 전체가 취소되는데, 세이브포인트는 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용하게 됩니다.
  3. 세이브포인트를 쓰면 현재의 트랜잭션을 작게 분할하는 것이 가능합니다.
  4. 세이브포인트는 여러 개의 SQL문의 실행을 수행하는 트랜잭션의 경우에 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 수 있습니다.
  5. 세이브포인트를 쓰려면 취소하려는 지점을 명시한 뒤, 그 지점까지 작업을 취소하는 식으로 사용하는데 이 지점을 세이브포인트라고 합니다.
  6. 세이브포인트를 지정한 뒤 rollback to save point name; 을 실행하면 해당 세이브포인트 지점까지 처리한 직업이 롤백된다.


이상으로 트랜젝션과 ACID에 대한 포스팅을 마치겠습니다!

profile
"personality begins Where Comparison ends"
post-custom-banner

0개의 댓글