데이터베이스에서 트랜잭션이란?

코딩하는범이·2022년 8월 23일
0

트랜잭션이란?

트랜잭션이란 영단어의 뜻으로는 거래 또는 수행을 뜻한다. 데이터베이스에서는 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻한다.

위키백과에서 나온 정의를 확인해 보면 아래와 같다.

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

간략하게 말하면, DML을 이용해서 데이터베이스에서 무언가를 수행하는 작업을 뜻한다.

정의를 말하자면 위와 같고 실제로 데이터베이스에서 트랜잭션을 살펴보면, 질의(query)를 하나의 묶음 처리해서 실행하되 예상치 못한 상황이 생겨 실행이 중단 됬을 경우 처음부터 실행하는 Rollback을 수행하며 오류 없이 실행을 마치면 Commit 하는 실행 단위를 의미한다.

Rollback

데이터 변경 사항이 취소되어 데이터를 이전 상태로 복구하는 것을 말한다.

Commit

트랜젝션의 처리 과정을 데이터베이스에 반영하기 위해서, 변경된 내용을 최종 모두 영구 저장한다.

우리가 SQL 작성시 Commit 명령어를 사용하지 않는 이유는 auto commit이 설정되어 있어 그렇다고 한다

트랜잭션을 사용하는 이유

트랜잭션은 DB 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다.

위의 말이 매우 복잡한데 예를 들자면, 계좌에서 돈을 송금한다고 가정 했을때 A 회원은 B 회원에게 10,000원 이라는 돈을 보낼 것이다. 프로그래밍상으로 간단하게 생각해서 A 회원, B 회원 두개 Row에 해당하는 데이터에 Update Query를 사용 할 것인데 A 회원의 계좌에서 -10,000원을 성공적으로 수행하고 B 회원의 계좌를 +10,000 하려는 순간 에러가 발생했다. 이렇게 되면 A 회원의 계좌는 돈만 차감되고 이체가 안된 상황이 발생이 된다. 이러한 경우가 발생하지 않도록 오류가 발생하면 처음부터 계좌 이체를 하도록 하는 것이 Rollback이다. 오류가 발생하지 않고 정상적으로 완료했다면 Commit을 한다.

트랜잭션의 특성

트랜잭션에는 4가지 특성이 존재하는데 ACID 특성이라고 한다.

  • 원자성
  • 일관성
  • 격리성(고립성)
  • 지속성

아래에서 4가지 특성에 대해서 자세히 알아보자.

원자성 (Atomicity)

원자성이란 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 말한다.
쉽게 말해서 다 수행하거나 아예 안하거나 이다. 작업의 일부분만 실행하지 않는 다는것을 의미한다.

원자성 보장

데이터베이스에서는 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 commit된 상태를 임시 영역인 롤백 세그먼트에 따로 저장한다. 그러다가 현재 수행하고 있는 트랜잭션에 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 Rollback을 수행한다.

롤백 세그먼트

이전에 commit된 데이터를 임시로 저장하는 영역을 롤백 세그먼트라고 한다.
트랜잭션이 시작하려면 반드시 롤백 세그먼트가 있어야하고 이는 사용자가 수동으로 지정할 수도 있다.

일관성 (Consistency)

일관성은 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다는 뜻이다.
하나의 트랜잭션을 통해서 데이터의 값이 변경될 수는 있어도, 타입 또는 규칙을 수정할 수는 없다는 것을 의미한다. 예를 들면, 정수형으로 저장되던 부분이 문자열로 변경 될 수는 없다.

일관성 보장

트랜잭션 수행 전과 수행 후 데이터 모델의 모든 제약 조건(기본키, 외래키 등)을 만족하는 것을 통해 보장한다. 예를 들어 Member 테이블과 Department 테이블이 있을때 Member 테이블에 department_id가 외래키로 존재한다고 가정하면, department_id의 제약조건이 변경이 되면 member 테이블에서도 변경이 되어야 한다.

격리성 (Isolation)

격리성은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻이다. 즉 트랜잭션끼리는 서로를 간섭 할 수 없다.

예를 들면, 워터밤 페스티벌 남은 티켓 수가 10개였을 때 실제로 예매하는 로직은 다음과 같다.

현재 있는 티켓의 수를 확인한다(SELECT)
남은 티켓 수에서 1을 빼고 업데이트 시킨다.(UPDATE)
이것을 사용자 A와 사용자 B가 동시에 수행하면 어떻게 될까? 2명이 티켓을 확보한다면 원래 예매 가능 티켓 수는 2개가 줄어야 하지만, 티켓을 동시에 확보하게 되면 티켓 예매 가능 수는 1개만 줄어들게 된다.

이러한 문제때문에 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다. 즉 병행 처리는 될 수 없다.

격리성 보장

Lock & excute unlock

lock & excute unlock 을 통해 고립성을 보장할 수 있다.
데이터를 읽거나 쓸 때에는 Lock을 걸어서 다른 트랜잭션이 접근하지 못하도록 격리성을 보장하고 작업이 완료되면 unlock을 통해서 자원에 다른 트랜잭션이 접근할 수 있도록 허용하는 방식이다.

shared_lock

트랜잭션에서 데이터를 읽을 때, 여러 트랜잭션이 읽을 수 있도록 허용하는 lock을 shared_lock이라 한다. shared_lock은 오직 읽기만 허용한다.

exclusive_lock

데이터를 쓸 때에는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 exclusive_lock을 사용한다.
그리고 작업이 끝나면 unlock을 통해 다른 트랜잭션이 접근할 수 있도록 한다.

위의 경우 deadlock이 걸릴 수 있는데 RDBMS는 자동적으로 deadlock을 인지하고 교착상태를 해결하기 위해 특정 하나의 트랜잭션을 취소시킨다고 한다.

2PL 프로토콜 (2 Phase Locking protocol)

deadlock이 걸리면 안되는 것을 전제로 고립성을 보장해야 한다는 2PL 프로토콜이 등장했는데 2PL 프로토콜이란 여러 트랜잭션이 공유하고 있는 데이터에 동시에 접근할 수 없도록 하기 위한 프로토콜이다.
growing phase, shrinking phase 두가지 단계의 locking이 존재하는데 growking phase는 읽기 lock, 쓰기 lock 연산만 수행할 수 있고 shrinking phase는 unlock 연산만 수행할 수 있다.

2PL 프로토콜은 이러한 특성을 통해 데이터 오류 가능성을 사전에 예방할 수 있고 직렬화를 보장하는데 교착상태의 문제는 해결되지 않는다. 이러한 문제를 해결하기 위해서 현재 대부분의 DBMS는 엄격한 2PL 규약을 이용하여 동시성 제어를 구현한다.

엄격한 2PL 규약

모든 X-lock에 대한 unlock 연산을 트랜잭션이 완전히 완료된 후에 실행한다.

다중 버전 동시성 제어 (MVCC)

MVCC는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나인데 데이터를 접근할 때 데이터베이스의 snapshot을 읽고 snapshot 데이터를 변경한다. 트랜잭션이 commit이 되기 전까지 만들어진 변경사항은 다른 데이터베이스 사용자가 볼 수 없다. 그리고 사용자가 데이터를 업데이트하면 이전 버전에 데이터를 업데이트 하는게 아니라 새로운 버전의 데이터를 UNDO 영역에 생성한다. 이전 버전의 데이터와 비교해서 변경된 내용을 기록하게 되고, 사용자는 마지막 버전의 데이터를 읽게 된다.

특징으로는 아래와 같다.

  • 2PL이나 Locking 방식보다 빠르게 동작한다
  • 사용하지 않는 데이터가 계속 쌓이게 되어 데이터를 정리하는 시스템이 필요하다
  • 데이터 버전이 충돌 할 수 있기 때문에 애플리케이션 영역에서 문제를 해결해야 한다.

지속성 (Durability)

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 부분은 영원히 반영이 되는 것을 말한다.

지속성 보장

지속성 보장을 위해 시스템에 장애가 발생했을 때 데이터베이스를 원래 상태로 복구하는 회복 기능이 필요하다.

출처

  1. https://medium.com/pocs/%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4-%EA%B8%B0%EB%B2%95-%EC%9E%A0%EA%B8%88-locking-%EA%B8%B0%EB%B2%95-319bd0e6a68a
  2. https://victorydntmd.tistory.com/129
  3. https://mangkyu.tistory.com/30
  4. https://mangkyu.tistory.com/53
profile
기록 그리고 기억

0개의 댓글