[🍓트랜잭션의 정의]
트랜잭션(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) 된 트랜잭션은 시스템이 고장나더라도 영구적으로 반영되어야 한다.
만약 트랜잭션을 스프링으로 사용하고 싶다면 내 다음글을 참고해주길 바란다.
'[스프링 DB] > 트랜잭션' 카테고리의 다른 글
[스프링 DB] 트랜잭션이 적용 안됨, 트랜잭션 주의 사항 (1) | 2023.06.28 |
---|---|
[스프링DB] 트랜잭션의 작동원리, 프록시 - 기록만이 살 (1) | 2023.06.28 |
[자바 스프링] Test 에서의 트랜잭션 사용 (0) | 2023.06.20 |
[스프링] 트랜잭션의 이해와 활용,@Transactional 원리 - 기록만이 살길 (0) | 2023.06.14 |
[스프링 오류]Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) 설정오류 (0) | 2023.06.08 |