트랜잭션이란?
DB에서 하나의 작업단위라고 설명할 수 있습니다
대표적인 예시를 들면 부모님이 자식에게 은행 이체를 통해 돈을 보내주려고 할 때
진행순서 ( DB를 기준으로 )
- 은행 계좌 정보를 select를 통해 검색
- 계좌 정보가 있다면 부모님 계좌 update -1,000,000원
- 계좌 정보가 있다면 자식 계좌 update +1,000,000원
- 이후에 추가적인 부분이 발생할 수 있음
이때 어디선가 장애가 발생해서 하나의 작업이라도 취소가 되었다면 이체라는 작업이 수행되지 않은 것이나 다름없기에
계좌 이체라는 하나의 작업단위
정의
- 업무 처리의 논리적 단위
- 하나의 건수로 처리되어야 하는 분리될 수 없는 연산 집합
- All or Nothing
트랜잭션의 특성
위 예시처럼 하나의 트랜잭션 단위를 유지하며 실행하기 위해 만족시켜야하는 특성
ACID → 트랜잭션이 성공적으로 실행되기 위해 반드시 만족해야 하는 성질
- 원자성 Atomicity ⇒ 나눠질 수 없다 All or Nothing
- 일관성 Consistency ⇒ 트랜잭션 실행 전과 후에도 항상 일관성이 있어야 한다
- 격리성 Isolation ⇒ 트랜잭션 실행 중 연산의 중간결과를 다른 트랜잭션이 접근 할 수 없다
- 영속성 Durability ⇒ 트랜잭션이 일단 성공적으로 실행되면 그 결과는 영속적
트랜잭션 처리
실제로 트랜잭션 단위로 처리하기 위해 고려해봐야 할 부분 3가지
장애와 회복 그리고 병행제어
1) 장애
DB에서 시스템 장애 (하드웨어 오작동) , 미디어 장애(저장 미디어 붕괴)가 있지만
트랜잭션 장애가 DB를 사용하면서 발생한 장애 중 99%를 차지함
트랜잭션 장애란?
- 논리적 오류
- 입력 데이터 불량
- 시스템 자원 과다 사용
등등이 원인
2) 회복
회복에 대한 부분은 DBMS에 따라 다르고 깊게 들어가면 상당히 복잡해짐(DBMS의 성능에 영향)
⇒ 회복 동작의 기본적인 실행 단위
commit과 rollback 그리고 REDO(재실행)와 UNDO(취소) 회복 단위
- 회복 기법중 하나인 검사시점 회복
로그: 트랜잭션의 단위로 작성한 하나의 트랜잭션 저장 기록( 실제로 트랜잭션이 commit 되었는지 아닌지가 적혀있다 → 트랜잭션이 실행이 완료되었는지 아닌지 )
검사 시점 이후로 로그를 확인하면서 UNDO와 REDO를 반복함
3) 병행제어
DB를 사용하는 목적인 정확성과 공용성을 만족시키기 위해 필요함.
병행제어가 되지 않는다면? → 충돌이 발생함 → 충돌이 발생하면?
- 데이터의 모순성
- 성능 저하 ( 회복작업을 위한 연쇄 복귀 등등..)
- 의도치 않는 결과가 발생가능
- 갱신 분실
충돌(conflict)을 관리하는 것이 중요함
예시로써 위 트랜잭션에서 select문으로 계좌 잔액 검색을 할 때 혹시라도 다른 트랜잭션 작업에서 돈이 이체 된다면?
하지만 이렇게 충돌이 절대 발생하지 않도록 해야하는 작업이 있는가하면 충돌이 일어나도 별 상관없는 작업들이 있습니다. 이러한 작업을 수행할 때 트랜잭션이 충돌하지 않도록 한다면 효율적이지 못할 수가 있습니다.
트랜잭션 격리 수준
격리 수준이 높으면 충돌이 발생하진 않지만 트랜잭션 처리 속도가 낮아질 수 있음.
격리 수준이 낮으면 충돌이 많이 발생하지만 처리 속도가 빠름.
따라서 DB의 특성에 따라서 어떤 격리 수준을 가질지 생각해봐야 하고 DB의 성능에 중요한 영향을 끼침
[DB] 트랜잭션 격리 수준(Transaction Isolation Level)
https://www.youtube.com/watch?v=e9PC0sroCzc
'TIL > 개념정리' 카테고리의 다른 글
React-query useMutation 간단히 사용해보고 정리 (0) | 2022.08.18 |
---|---|
Git, Github 정리 (0) | 2022.07.29 |
Nginx와 apache가 무엇인지 (0) | 2022.07.21 |
swagger가 필요한 이유와 정리 (0) | 2022.07.19 |
API 쉽게 이해하기 (0) | 2022.07.19 |