[데이터베이스] 트랜잭션 혹시.. 너 뭐 돼?
트랜잭션이란?
트랜잭션은 데이터를 접근하고 변경하는 논리적 단위다.
데이터베이스 시스템 내부에서는 사용자 질의를 처리할 때 트랜잭션 단위를 사용한다.
트랜잭션 관리
트랜잭션에서 다뤄야 할 2가지 이슈가 있다.
- Failure
어떤 트랜잭션을 수행할 때 하드웨어/소프트웨어/트랜잭션 내부에서 failure가 발생할 수 있다. 트랜잭션에는 데이터베이스를 변경하는 연산이 포함될 수 있는데, 시스템 장애가 발생하면 변경된 값이 제대로 저장되지 않을 수 있다.
- Concurrent execution
보통 수많은 사용자들이 데이터베이스 시스템에 접속해서 데이터를 검색하거나 변경한다. 이때 여러 트랜잭션이 동시에 수행될 텐데, 트랜잭션에서 동일한 데이터를 읽거나 쓰는 작업을 할 때 그 데이터 값이 항상 consistent 해야 한다.
트랜잭션 성질
트랜잭션은 반드시 4가지 성질(ACID)을 만족해야 한다.
1. Atomicity (원자성)
all or nothing. 트랜잭션에 모든 연산이 반영되거나, 아무것도 반영되지 않거나 둘 중 하나여야 한다.
1. read(A)
2. A := A – 50
3. write(A)
4. read(B)
5. B := B + 50
6. write(B)
A 계좌에서 B 계좌로 50만원을 이체하는 트랜잭션이 있다고 가정하자. 3번 라인까지 잘 실행하고 6번 라인 이전에 시스템 장애가 발생하면 어떻게 될까? 트랜잭션을 끝까지 실행할 수 없다면 원래 데이터 값으로 다시 변경해야 한다. 즉, 일부만 실행된 트랜잭션의 업데이트는 데이터베이스에 반영될 수 없다. 원자성을 만족하기 위해 롤백이 필요하다.
2. Consistency (일치성)
단일 트랜잭션 수행은 데이터 무결성을 유지한다. 데이터 무결성 제약에는 '명시적으로 선언된 제약'과 '묵시적으로 선언된 제약'이 있다.
- Explicitly specified integrity constraints (명시적으로 선언된 제약)
(예) primary keys, foreign keys - Implicit integrity constraints (묵시적으로 선언된 제약)
(예) 트랜잭션 수행 전과 후의 sum 값은 같다.
3. Isolation (고립성)
실제로는 동시에 여러 트랜잭션이 실행되지만, 각각의 트랜잭션은 다른 트랜잭션이 없다고 생각하고 자신의 트랜잭션에 집중할 수 있도록 해 준다.
고립성을 보장하는 가장 단순한 방법은 여러 개의 트랜잭션을 직렬적으로 수행시키는 것이다. (one after the other) 한 트랜잭션이 끝나고 난 이후에 공통되는 데이터를 접근하는 것이기 때문에 두 트랜잭션 간 간섭이 생길 수 없다. 하지만, throughput과 average response time 관점에서 성능이 좋지 않아서 실제로 직렬 수행하진 않는다.
4. Durability (지속성)
한 번 완료된 트랜잭션의 결과는 후에 시스템 장애가 발생하더라도 데이터베이스에 반영되어야 한다.
만약 고객이 정상적으로 50만원을 이체했는데, 다음날 시스템 장애로 인해 은행에서 거래 내역을 확인할 수 없다면 큰 문제가 발생할 것이다. 이처럼 지속성이 보장되지 않은 데이터베이스 시스템은 실생활에서 사용할 수 없다.
트랜잭션 상태
트랜잭션 상태에는 active
, partially committed
, committed
, aborted
가 있다.
다이어그램 형식으로 보면 아래와 같다.
Author And Source
이 문제에 관하여([데이터베이스] 트랜잭션 혹시.. 너 뭐 돼?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bjy100/데이터베이스-트랜잭션-혹시..-너-뭐-돼저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)