이번 포스팅은 데이터베이스의 트랜잭션에 대한 내용을 담고 있습니다.
다들 호캉스나 여행을 위해 호텔을 예약해본 경험이 있으신가요?
만일 예약일에 해당 호텔을 방문 했더니 나와 같은 방을
예약한 손님이 나 말고도 3명이나 더 있다면 어떡해야 할까요?
좀 더 시간을 돌려 호텔 매니저가 예약일 하루 전에 이 사실을 알았더라면 어떻게 했을까요?
아마 저라면 가장 먼저 예약장부를 뒤져 예약한 손님들의 연락처 정보를 먼저 찾을겁니다.
빨리 다른 방으로 변경해드리거나, 과실로 인한 추가 서비스를 제안드려야 할테니까요.
그런데 만일 예약을 받을때 손님들의 회신가능한 번호들을 적어놓지 않았다면 어떻게 될까요?
생각만해도 아찔한 상황입니다😨
이러한 상황은 데이터베이스에서도 마찬가지입니다. 예약을 하고, 취소를 하는 등의 하나의
사건 단위를 데이터베이스에서는 트랜잭션이라고 부릅니다.
트랜잭션(Transaction) :
데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위
❓ "데이터베이스의 상태를 변화시킨다는 것"
❓❓ "작업 단위"
❓❓❓ Example
💰 1. 은행 시스템
A계좌에서 B계좌로 송금을 하는것은, 각각 계좌에 INSERT/DELETE 혹은 UPDATE
쿼리문이 수행되는 것을 의미하며, 두번의 쿼리문이 하나의 사건이므로 한단위 두 쿼리가 하나의
트랜잭션이라 할 수 있습니다.
📰 2. 인터넷 게시판
- 글을 작성하고 나서 완료 버튼을 누르면 글이 게시
- 재고가 있는 물건에 대하여 장바구니에 담기
- 주문한 물건에 대하여 주문 취소 신청
위와 같은 작업 또한 서버내의 데이터베이스의 상태가 변하기 때문에 하나의 트랜잭션입니다.
트랜잭션을 먹어 본 제 주변 지인들의 말에 의하면 트랜잭션은 엄청 신맛이라고 합니다.
왜냐면 트랜잭션은 산성(ACID)을 지니기 때문이죠..트랜잭 셔!!...죄송합니다...
하나의 트랜잭션이 안전하게 그 기능을 보장받기 위해서는
ACID라는 트랜잭션의 성질을 다 충족시켜 주어야 합니다.
트랜잭션의 성질에 대해 하나씩 알아보겠습니다.
🔴 트랜잭션을 구성하는 연산은 반드시 모두 실행이 되거나, 혹은 아예 실행되지 않아야 함 🔴
미지근한 그 어딘가는 있어서는 안되는 것이죠.
다시말해, 하나의 트랜잭션에서 일부 연산만 실행되면 안되고,
일부만 실행될 수 없어야 합니다.
🟡트랜잭션이 완료된 상태에서, 트랜잭션 이전의 상황과 동일하게 데이터의 일관성이 존재 🟡
트랜잭션 수행 이전의 송금자와 수금자의 잔액 합이 수행 후에 달라지거나,
혹은 잔액을 나타내는 자료형이 정수형에서 문자열로 바뀌는 등의 모순이 발생해서는 안됩니다.
🟢트랜잭션은 다른 트랜잭션에 간섭을 주거나 받지 않고 독립적으로 수행 🟢
둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행 중인 트랜잭션이 완료되기 전에
현재 트랜잭션이 생성한 중간 연산 결과를 다른 트랜잭션이 접근하면 안 됩니다.
독립성을 통해서, 사용자들은 여러 트랜잭션이 동시에 수행되고 있는 것처럼
느끼면서도 무결성이 깨지지 않고, 정확한 결과를 얻을 수 있게 됩니다.
🔵 트랜잭션이 성공적으로 완료되었을 때 그 결과는 영구적으로 반영 🔵
시스템의 장애가 발생하더라도 결과는 데이터베이스에 그대로 남아있어야 하며, 지속성을 보장하기 위해서 회복 기능이 필요합니다.
✅트랜잭션은 원격으로 데이터베이스라는 일지를 수정하도록 요청하는 것입니다.
보통 DB를 사용할때, query를 날리면 데이터베이스에 반영이 된다고 생각하지만,
DB에 반영되는 시점은 트랜잭션 연산이 성공적으로 완료되는 시점에 실제 데이터 베이스에
반영이 됩니다. 이러한 트랜잭션 연산에는 크게 두가지가 있습니다.
savePoint는 트랜잭션 내부에서 사용자가 지정할 수 있는 세부 작업 단위 입니다.
아래의 그림처럼 특정 지점에 savePoint를 설정 한 후 'Rollback to savePoint1' 을
통해 해당 지점으로 롤백을 할 수 있습니다.
여기서 기억해야할 점은 아래 그림에서 SP1으로 롤백을 한 뒤에는 미래 시점인
SP2의 savePoint는 삭제 된다는 것입니다.
트랜잭션의 상태는 총 5가지가 존재합니다.
활동(Active) : 트랜잭션이 실행 중인 상태
실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
부분완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만,
Commit 연산이 실행되기 직전의 상태
완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
유지하는지에 대하여 알아 보았습니다.
다음 포스팅에서는 이러한 트랜잭션의 격리수준에 대해 포스팅하도록 하겠습니다.
참고
tcp socket 통신을 기반으로 db server에 접속하여 트랜잭션이 일어나는 건가요?