-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[남기훈] 3주차 과제 제출합니다. #14
Open
gikhoon
wants to merge
1
commit into
develop
Choose a base branch
from
gikhoon-03
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
# 트랜잭션 파헤치기 | ||
날씨가 많이 추워졌죠? 붕어빵 먹어야 하는 시즌인데 집 주변에 붕어빵 가게가 없어서 슬프네요. | ||
|
||
또 길거리에 있는 붕어빵은 카드가 안되는 곳이 많잖아요. 그래서 보통 계좌이체를 하는데 | ||
이 때 돈을 분명 보냈는데 붕어빵 사장님에게는 오류가 걸려서 돈이 안 들어오는 거에요. | ||
|
||
오류가 났으면 내 돈도 빠져나가면 안되는데 내 돈은 가져가 놓고 사장님에게는 입금이 안되면 안되잖아요. | ||
|
||
슬슬 눈치채셨죠? 이런 상황이 발생하지 않기 위해 꼭 알아야하는 주제 | ||
|
||
DB에서 중요한 주제인 트랜잭션에 대해 알아보겠습니다. | ||
|
||
## 트랜잭션이란? | ||
트랜잭션(Transaction)은 "더이상 분할이 불가능한 업무처리의 단위"를 의미합니다. | ||
|
||
위에 말했던 것처럼 입금-출금은 한 묶음으로 이루어져야 합니다. 둘 다 성공하거나 둘 다 실패하거나 둘 중에 하나여야 합니다. 이는 트랜잭션에서 Commit(성공), RollBack(실패) 로 표현됩니다. | ||
|
||
당연한거 아니야?라고 생각할 수 있지만 DB 입장에서 업무는 여러 명령문이 합쳐진 상태입니다. 이 때 | ||
하나하나 명령어가 독립적이면 위와 같은 문제가 발생할 수 있기 때문에 여러 명령문을 통채로 묶어 한 단위로 나타낸 것이 | ||
트랜잭션입니다. | ||
|
||
## 트랜잭션 특징 | ||
|
||
트랜잭션의 4가지 특징을 알아보면 | ||
- 원자성 (Atomicity) | ||
|
||
트랜잭션에 해당하는 명령어가 데이터베이스에 모두 반영되던가, 전혀 반영되지 않아야 한다는 것이다. | ||
|
||
|
||
- 일관성 (Consistency) | ||
|
||
작업 처리 결과는 항상 일관되어야 한다. | ||
트랜잭션이 진행되는 도중에 데이터베이스가 변경된다 하더라도 변경된 버전이 아닌 | ||
처음 트랜잭션을 위해 참조한 데이터베이스로만 진행된다. | ||
|
||
|
||
- 독립성 (Isolation) | ||
|
||
여러 트랜잭션이 동시에 실행되고 있는 경우 한 트랜잭션이 다른 트랜잭션에 들어올 수 없다. | ||
|
||
|
||
- 영구성 (Durability) | ||
|
||
트랜잭션이 성공적으로 반영(COMMIT)됐을 경우 결과는 영구적이어야 한다. | ||
|
||
|
||
## 트랜잭션 상태 | ||
|
||
다음은 트랜잭션의 상태를 표현한 그림입니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYYfN7%2FbtsKyUUgGf2%2F0fuK5yuN1q97QxuWl0Ct1K%2Fimg.png" /> | ||
|
||
먼저 코드가 실행되면서 DB의 명령어가 실행되는 과정에는 활성 상태에 있습니다. | ||
이후 트랜잭션 내에 모든 명령어가 진행되면 부분완료 상태입니다. | ||
이 때는 아직 DB에 반영이 되지 않은 상태입니다.관리자의 최종 승인(COMMIT)이 있어야만 | ||
완료(COMMITED) 상태에 들어가게 됩니다. | ||
관리자가 거절하면(ROLLBACK) 부분 완료 상태에서 중단(Abort) 돼 실패 상태로 가게 됩니다. | ||
|
||
|
||
명령어 진행 도중 오류가 발생해도 실패(Failed) 상태로 이동하고 철회(aborted)됩니다. | ||
|
||
|
||
## 커밋과 롤백 실습 | ||
|
||
커밋과 롤백가 어떻게 보이는지 예시를 통해 설명해보겠습니다. | ||
|
||
먼저 2개의 mysql에 접속합니다. 왼쪽이 DB1 오른쪽이 DB2라고 하겠습니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkVynq%2FbtsKyhWHTVO%2FQZgKkGjgawoFeXTjLTVESk%2Fimg.png" /> | ||
|
||
다음과 같은 테이블이 존재할때 아직 서로 같은 데이터를 보여주고 있습니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb869E0%2FbtsKw53Nxqm%2FmJuGRsxJzMoMHYPMgPXalK%2Fimg.png" /> | ||
|
||
DB1 해당 명령어를 통해 테이블에 새로운 데이터를 넣어보았습니다. | ||
|
||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu9LAZ%2FbtsKyFXj3IO%2FYiLlR6AGx4iZCbNuQgXKPk%2Fimg.png" /> | ||
|
||
<br> | ||
|
||
이를 통해 DB1에 새로운 데이터가 들어간 것을 확인할 수 있습니다. | ||
|
||
하지만 아직 트랜잭션이 끝나지 않았기 때문에 해당 명령어는 반영되지 않은 상태입니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc40XjM%2FbtsKwrGx3Qn%2FSi1s3fku4Tk614kI6PffH0%2Fimg.png" /> | ||
|
||
따라서 두 테이블의 데이터가 다른 것을 확인할 수 있습니다. | ||
|
||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr1huA%2FbtsKxwNG2mR%2FsBoixi0SMpadkAUndF1ZPK%2Fimg.png" /> | ||
|
||
아직 적용되지 않은 DB1에 커밋을 진행합니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UBhn%2FbtsKxHnO2mN%2FaKR5G1y0LihAvbQzH28guK%2Fimg.png" /> | ||
|
||
그러면 이제 쌓여있던 명령어가 데이터베이스에 적용돼 DB2에서도 새로운 데이터가 보이게 됩니다. | ||
|
||
## SPRING에서 트랜잭션 전파 방식 | ||
그러면 한 트랜잭션이 진행 중일 때 다른 트랜잭션이 들어오면 어떤 식으로 작동하는지에 대한 내용입니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQu6j%2FbtsKyhbpwRQ%2Fjce9kjtjlQtWLQ3mjfHwAk%2Fimg.png" /> | ||
|
||
외부 트랜잭션에서 메소드 호출을 내부 트랜잭션이 실행된다. 이 때 두 트랜잭션은 서로 어떤 영향을 미칠까? | ||
|
||
|
||
|
||
트랜잭션 전파 방식은 총 7가지가 존재하지만 그중 중요한 2개만 설명해보도록 하겠습니다. | ||
|
||
|
||
|
||
1. REQUIRED 속성(DEFAULT) | ||
|
||
REQUIRED 속성으로 설정하면 외부 트랜잭션과 내부 트랜잭션이 하나의 트랜잭션으로 묶이게 됩니다. | ||
|
||
즉 외부 트랜잭션이 진행되다가 내부 트랜잭션을 호출하면 내부 트랜잭션이 기존의 트랜잭션에 들어가 진행되다가 종료되면 다시 외부 트랜잭션으로 돌아와 나머지 부분을 실행합니다. | ||
|
||
|
||
|
||
이 때문에 내부 트랜잭션에서 에러가 발생하면 내부 트랜잭션 뿐 아니라 외부 트랜잭션도 같이 ROLLBACK 됩니다. | ||
|
||
|
||
|
||
예를 들어 출금 트랜잭션을 진행하다가 입금 트랜잭션을 호출하는데 이 때 입금에서 에러가 발생하면 출금도 ROLLBACK되는 기본적인 방식입니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrcd8l%2FbtsKwOBcCJl%2FtyNdUdj84AiWGbXeYyakk1%2Fimg.png" /> | ||
|
||
2. REQUIRES_NEW 속성 | ||
|
||
REQUIREDS_NEW 속성으로 설정하면 내부 트랜잭션이 호출되면 다른 트랜잭션이 생성됩니다. | ||
|
||
내부 트랜잭션에서 오류가 발생하면 내부에만 ROLLBACK되고 외부 트랜잭션으로 돌아가게 됩니다. | ||
|
||
|
||
이는 내부 트랜잭션과 외부 트랜잭션이 서로 영향을 미치면 안될 때 사용합니다. | ||
|
||
예를 들어 회원가입 때 로그 찍는 트랜잭션을 호출할 때 로그를 안 찍었다고 회원가입까지 rollback 시키면 안되기 때문에 이럴때 따로 트랜잭션을 빼서 작업하는 방식으로 이용됩니다. | ||
|
||
<img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd15D3o%2FbtsKyTHTtpE%2F17q3yxJqBc5YJKDa8y0vQ0%2Fimg.png"> |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
예시가 있으니까 더 좋은 것 같아요~👍👍