2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[트랜잭션 이란 무엇인가?] - 트랜잭션의 이해

2023. 6. 8. 20:49ㆍ[스프링 DB]/트랜잭션

 

[🍓트랜잭션의 정의]

 

트랜잭션(Transaction)은 데이베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기

위한 작업의 단위 또는 한꺼번의 수행되어야 하는 일련의 과정이다.

 

 

이렇게 만들어서는 어떤 것인지 햇갈린다. 한번 그림으로 보도록 하자.

 

 

 

[🍊트랜잭션의 동작 ]

 

예를 들어 하나 생각해보자.

 

우리는 어떤 사람에게 송금을 하고싶다.

나에게는 "10,000원의 돈이 있고 이 중에 3천원을 상대방에게 보내고 싶다.

그렇다면 이 과정은 어떻게 되는가 ?

 

나 -> 10,000원이 있는지 확인 -> 상대방 이름 확인 -> 송금 -> 상대방 돈 입금 

 

이 순으로 돈이 보내진다고 하자. 그렇다면 나에게 10,000원이 있는 것은 확인 되었다

하지만 이 돈을 보내는 과정에서 오류가 생겼다.

 

그렇다면 이 과정들을 보자

 

나 -> 10,000원이 있는지 확인 ->-> 상대방 이름 확인 ->  송금 ->Error -> 상대방 돈 입금

 

이 송금 과정에서 Error가 뜨면 어떻게 될까?

이렇게 된다면 내 돈은 사라지고 상대방에게 돈은 입금되지 않는 상황이 생긴다.

 

 

자 그렇다면 한번 봐보자 

 

입금자 : 홍길동  금액 0 원 

송금자 : 김좌진  금액 10,000

 

이렇게 입금자와 송금자가 있다. 이 상황에서 에러가 터진다면

 

입금자 : 홍길동  금액 0 원

송금자 : 김좌진  금액 7,000

 

이렇게 송금자의 계좌에서 3천원이 빠져나갔지만 

입금자의 금액은 0원이 되는 엄청나게 치명적인 상황이 발생한다.

 

트랜잭션은 결국에는 이러한 일련의 과정들을 하나로 묶어서

 

나 -> 10,000원이 있는지 확인 -> 상대방 이름 확인 -> 송금 -> 상대방 돈 입금 

 

이런식으로 이 일련의 과정중에서 오류가 발생한다면 이 과정들을 RollBack 시켜 버리는

일련의 과정들을 수행 하는 것 이다.

 

그렇기 때문에 트랜잭션은 

 

▶ 부분완료 ->Commit

▶ 실패 -> RollBack

 

이러한 상황을 가지고 있다.

 

[🍊Commit]

이 Commit부분을 한번 보도록 하자.

 

나 -> 10,000원이 있는지 확인 -> 상대방 이름 확인 -> 송금 -> 상대방 돈 입금 

 

이러한 상황에서 어떠한 Error도 뜨지 않고 이 일련의 과정들이 정상적으로 동작 했을때는

 

입금자 : 홍길동  금액 3,000

송금자 : 김좌진  금액 7,000

 

이런식으로 정상적으로 돈을 DB에 넣고 Commit을 해 DB에 저장하게 된다.

 

 

 [🍌RollBack]

 

그렇다면 RollBack의 경우도 한번 보도록 하자.

 

나 -> 10,000원이 있는지 확인 -> 상대방 이름 확인 -> 송금 -> Error -> 상대방 돈 입금 

 

이러한 일련의 과정 중 송금 후 Error가 발생되었다.

이렇게 된다면 트랜잭션은 이 하나의 과정 중 이상이 있다고 생각해

이 과정들 자체를 아예 되돌리는 RollBack을 해버리게 된다.

 

 

입금자 : 홍길동  금액 0 원

송금자 : 김좌진  금액 10,000원

 

그렇게 된다면 이렇게 3천원을 송금 했지만 에러가 발생해서 RollBack을 적용 했다.

그렇게 되면 이 3천원을 보낸 것은 반영되지 않는다.

 

 

 

 [🍌트랜잭션의 임시저장 ]

 

그렇다면 Commit과 RollBack은 어떻게 동작하는 것 일까?

 

 

 

 

 

이러한 세션 1 (A)와 세션 B가 있다.

 

트랜잭션은 Commit을 하기전까지는 DB에 값들을 "임시 저장" 해놓는다.

 

만약 이 일련의 과정들이 Commit이 된다면 정상적으로 DB에 데이터를 집어 넣고

 

RollBack을 해버린다면 이 DB에는 데이터들이 반영되지 않는다.

 

이렇게 트랜잭션은 동작하게 된다.

 

 

 

이렇게 1번의 들어간 DB는 정상적으로 Commit이 된 상황이지만

 

newId1 , newId2번의 데이터의 경우 Commit이 되지 않아서 임시 상태로 저장되어 있다.

 

이 상태에서 Commit을 하는 동작을 넣는다면 정상적으로 데이터들이 들어가거나

 

RollBack이 되서 데이터들이 사라지거나 이 두가지의 행동을 트랜잭션이 가지고 있다.

 

 

[🍌트랜잭션의 성질]

 

트랜잭션은 4가지의 성질을 가지고 있는데 하나씩 봐보도록 하자.

 

 

[🍌Atomic 원자성]

 

▶ 트랜잭션의 연산은 데이터베이스의 모두 반영이 되던지 아니면 전혀 반영되지 않아야 한다.

 

 

 

▶ 트랜잭션 내의 모든 연산은 반드시 완벽히 수행되어야 하며 , 모두가 완벽히 수행되지 않고 어느 하나라도

오류가 발생한다면 트랜잭션이 전부 취소가 되어야 한다.

 

 

즉 원자성이라는 것은 🍓트랜잭션의 RollBack 과 Commit이 반드시 되어야 한다는 뜻이 된다.

 

 

[🍌Consistency(일관성)]

 

▶트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성이 있는 데이터베이스 상태 변환한다.

 

▶시스템이 가지고 있는 고정요소는 트랜잭션의 수행 전과 트랜잭션 수행 후의 상태가 같아야 한다.

 

 

 

[🍌Isolation(독립성,격리성)]

 

▶둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이

끼어 들 수 없다.

 

 

▶수행중인 트랜잭션은 완전히 완료될때 까지 다른 트랜잭션서 수행결과를 참조할 수 없다.

 

 

[🍌Duryblitiy(영속성)]

 

▶성공적으로 완료(Commit) 된 트랜잭션은 시스템이 고장나더라도 영구적으로 반영되어야 한다.

 

 

 

 

만약 트랜잭션을 스프링으로 사용하고 싶다면 내 다음글을 참고해주길 바란다.