반응형
경험적으로 100% 질문이 들어왔던 부분이다, 잘 정리해두어야겠다고 생각했다!
- 데이터베이스를 만들기 & 추가 & 수정할 때는 어떻게 하나?
- select 나 update 와 같은 sql문을 사용하여 할 수 있다.
- 보통 트랜잭션이라는 일련의 논리적 단위를 사용하게 된다.
- 예를 들어서 송금을 할 때는 (계좌1에서 돈을 만원 빼서 + 계좌2에 만원 넣는다) 와 같은 여러 개의 sql 문이 합쳐질 것이다.
- 왜 굳이 트랜잭션을 사용해야 할까? 그냥 하면 안될까? 여러 요청이 동시에 여러개가 들어온다고 해보자. 어떻게 처리해야할까?
- (계좌1에서 돈을 빼서 계좌2에 넣어주세요) (계좌2에서 돈을 빼서 계좌 1에 넣어주세요)
- 트랜잭션별로 수행하지 않으면 실행 순서가 얽히게 된다. (계좌1에서 돈을 빼서 계좌2에서 돈을 빼서 ... 계좌 1에 넣어주세요 계좌2에 넣어주세요 ??)
- 트랜잭션의 4가지 특성
- A Atomicity 원자성
- 트랜잭션은 모두 반영이되든지 전혀 반영이 안되든지 둘 중 하나여야한다.
- 트랜잭션 내이 모든 명령은 반드시 완벽 수행되어야 하며, 그렇지 않다면 전부 취소되어야 한다.
- C Consistency 일관성
- 트랜잭션이 성공적으로 완료되면 일관성 있는 데이터베이스 상태로 변환한다.
- I Isolation 독립성
- 둘 이상의 트랜잭션이 동시에 병행 실행될 경우 서로 끼어들면 안된다. 독립적으로 실행되어야 한다.
- D Durability 지속성
- 성공적으로 완료된 트랜잭션은 영구적으로 반영되어야 한다.
- A Atomicity 원자성
- 트랜잭션의 연산
- Commit 연산
- 트랜잭션에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 경우 완료됐음을 알린다.
- Commit 연산
-
- Rollback 연산
- 트랜잭션 처리가 비정상적으로 종료되어 일관성을 깨뜨렸거나 일부만 정상적으로 처리되었을 경우 모든 연산을 취소하는 연산이다.
- 해당 트랜잭션 재시작 or 폐기
- Rollback 연산
트랜잭션의 상태트랜재션 연산 및 상태
- 활동(Active) : 트랜잭션이 실행중인 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
독립성(Isolation)은 어떻게 실현할까?
- 여러 트랜잭션이 동시에 실행된다면 여러 읽기 이상 현상이 발생할 수 있다. Dirty Read, Non Repeatable Read, Phantom Read
- Dirty Read 아직 commit되지 않은 값을 읽었는데 roll back이 되는 경우 : 잘못읽었다.
- Non Repeatable Read 같은 쿼리를 두 번 실행했는 데 결과값이 다르다.
- Phantom Read 같은 쿼리를 두 번 실행했는 데 없었던 쿼리가 튀어나온다.
- 이에 대한 고립 수준을 정하고 트랜잭션이 실행되는 동안 해당 필드에 Lock을 건다.
반응형
'CS' 카테고리의 다른 글
함수형 프로그래밍 (0) | 2021.08.27 |
---|---|
[Spring] ControllerAdvice가 어떻게 작동할까? (0) | 2021.08.22 |
[Spring] AOP란 무엇일까? (0) | 2021.08.21 |
[JAVA] 예외 처리 종류 (0) | 2021.08.16 |
Devops와 CI/CD (0) | 2021.08.05 |