1. 트랜잭션 이란?
트랜잭션(Transaction)은 데이터베이스에서의 논리적 작업 단위이다.
하나의 작업을 수행하기 위해 필요한 데이터베이스 연산 기능들을 모아놓은 것이며 분리되지 않도록 하여 작업의 완전성을 보장합니다.
즉, All or Nothing 이라는 슬로건 처럼 전부 처리되거나, 아예 처리되지 않아야 합니다.
그럼 작업 단위는 왜 필요한것 일까요?
예를 들어 봅시다. A사용자가 계좌에서 10만원을 출금하여 B한테 송금한다고 해봅시다.
위와같이 작업A, 작업 B 총 2개의 작업단위로 나뉘게 됩니다.
순서대로 작업되던 도중, 작업A 와 작업 B 사이에서 오류가 발생한다면 어떻게 될까요?
이미 작업 A는 처리되어 commit 된 시점이라, A의 돈 10만원은 차감되있는 상황입니다.
문제가 발생되었기 때문에 rollback을 하게 되는데, 가장 가까운 commit 시점인 작업 A 가 끝난 시점으로 돌아가게 됩니다.
이러면 A사용자는 돈 10만원을 날리게 된 것 이죠 ㅠ,ㅠ...
B는 돈을 받지도 못했는데 말이죠...
따라서 이러한 문제를 해결하기 위해 "작업 단위"를 직접 지정하게 되는 것 입니다. 다음 과 같이 말이죠!
auto-commit을 false로 해두었기 때문에 작업 A 를 진행하던 도중에 어디에서든 문제가 발생해도 맨 처음 "A계좌 조회" 전의 시작단계로 rollback하게 됩니다!!
이전과 같은 상황이라면 A의 10만원 또한 복구될 것 입니다!
이런 방식으로 트랜잭션은 데이터베이스의 회복과 병행 제어가 가능합니다.
즉, 데이터베이스에서 오류가 발생하는 경우의 빠른 회복이나, 여러 사용자가 동시에 데이터베이스를 사용할 수 있도록 제어해주는 중요한 역할을 하게되죠!
데이터베이스의 연산을 SQL문으로 표현한다면, 하나의 작업을 수행하는 SQL문의 집합으로 생각할 수도 있을것 입니다.
좀 뜬금없을수도 있지만 DB에서의 직렬화(Serializable)의 의미또한 살펴봅시다.
1-2) Serializable 의미
이러한 트랜잭션을 지원하는 가장 간단한 방법은 무엇일까?
바로 한 번에 하나씩의 트랜잭션만 실행하는 것 이다. 이를 Serial Schedule이라 부른다.
3개의 트랜잭션 A, B, C가 있을 때 한 번에 하나씩 실행했을 때 가능한 결과들의 집합은 총 3! 가지 이다.
A - B - C
A - C - B
B - A - C
B - C - A
C - A - B
C - B - A
실제 데이터베이스의 트랜잭션 결과가 Serial Schedule의 부분집합인 경우 Serializable이라고 한다.
2. 트랜잭션 성질
트랜잭션의 성질로 많이들 ACID를 이야기 합니다. 이에 대하여 알아봅시다.
1. 원자성 (Automicity)
트랜잭션을 구성하는 연산은 반드시 모두 실행이 되거나 혹은 아예 실행되지 않아야 한다.
즉, 하나의 작업범위인 트랜잭션에서 일부 연산만 실행되면 안 된다.
따라서 실행 도중에 오류가 발생하여 작업을 완료하지 못하였다면, 트랜잭션 전체를 취소하여 수행 이전으로 돌아가야 한다.
2. 일관성 (Consistency)
트랜잭션이 완료된 상태에서도 트랜잭션 이전의 상황과 동일하게 데이터의 일관성이 있어야 한다. 데이터에 모순이 있어서는 안 된다.
은행 송금 기능을 생각해보면, 트랜잭션 수행 이전의 송금자와 수금자의 잔액 합이 수행 후에 달라지거나, 혹은 잔액을 나타내는 자료형이 정수형에서 문자열로 바뀌는 등의 모순이 발생하면 안 된다.
3. 격리성 (Isolation)
트랜잭션은 다른 트랜잭션에 간섭을 주거나 받지 않고 독립적으로 수행되어야 한다.
둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행 중인 트랜잭션이 완료되기 전에 중간 연산 결과에 다른 트랜잭션이 접근할 수 없다.
독립성을 통해서, 사용자들은 여러 트랜잭션이 동시에 수행되고 있는 것처럼 느끼면서도 정확한 결과를 얻을 수 있게 된다.
4. 지속성 (Durability)
트랜잭션이 성공적으로 완료되었을 때 그 결과는 영구적으로 반영되어야 한다.
시스템의 장애가 발생하더라도 결과는 데이터베이스에 그대로 남아있어야 하며, 지속성을 보장하기 위해서 회복 기능이 필요하다.
3. 연산의 종류
트랜잭션의 연산으로는 크게 Commit과 Rollback 두 가지가 있다.
1. Commit 연산
Commit 연산은 하나의 트랜잭션이 성공적으로 종료된 후, 연산이 완료되었다고 트랜잭션 관리자에게 알려주고 결과를 최종적으로 데이터베이스에 반영하는 연산이다.
2. Rollback 연산
Rollback 연산은 하나의 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 잃었을 때 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션 수행 이전의 상태로 돌아가는 연산이다.
우리가 직전에 위에서 살펴본 그림을 다시 살펴보자.
문제 발생 지점이 총 2곳인데, 여기서 문제가 발생하면 모두 Rollback하여 A계죄 조회 전으로 작업이 돌아가야 한다.
만약 "B 10만원 증가"까지 연산이 완료된다면, 이때 Commit을 하고 DB에 반영시키면 된다.
4. 트랜잭션의 상태
트랜잭션의 상태로는 다음 5가지가 있다. 이를 그림으로 살펴보자.
1. 활성화(Active) : 트랜잭션이 작업을 시작하여 실행 중인 상태
2. 실패(Failed) : 트랜잭션에 오류가 발생하여 실행이 중단된 상태
3. 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
4. 부분 완료(Partially commited) : 트랜잭션의 마지막 연산까지 실행하고 commit 요청이 들어온 직후의 상태. 최종 결과를 데이터베이스에 아직 반영하지 않은 상태.
5. 완료(Commited) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태
'CS > DB (2022-1)' 카테고리의 다른 글
[DB] E-R 모델을 사용한 데이터베이스 설계 (0) | 2022.10.06 |
---|---|
[DB] 고급 SQL (1) | 2022.10.04 |
[DB] 중급 SQL - 2 (1) | 2022.09.30 |
[DB] 중급 SQL - 1 (1) | 2022.09.29 |
[DB] 관계형 모델 소개 (0) | 2022.09.26 |
댓글