'면접을 위한 CS 전공지식 노트' 책을 보며 공부한 내용입니다.
트랜잭션
데이터베이스에서 하나의 논리적인 기능을 수행하기 위한 작업의 단위
=> 데이터베이스에서 접근 방법은 쿼리 => 여러개의 쿼리들을 하나로 묶는 단위
이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있다. 이를 한꺼번에 ACID라고 한다.
- 원자성(atomicity)
- 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장
- ex) 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우. 그 이후에 모두 수행되지 않음을 보장하는 것.
- 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API 호출이 있으면 안된다. 만약 있다면, 롤백이 일어났을 때 어떻게 할 것인지에 대한 해결 방법이 있어야 하고, 트랜잭션 전파를 신경써서 관리해야 한다.
- 커밋과 롤백
- 커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어이다.
- 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것이다.
- 롤백은 트랜잭션을 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 것이다.
- 커밋과 롤백 덕분에 데이터의 무결성이 보장된다.
- 커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어이다.
- 트랜잭션 전파
- 트랜잭션을 수행할 때 커넥션 단위로 수행한다.
- => 커넥션 객체를 넘겨서 수행해야 한다.
- 하지만 이를 매번 넘겨주기가 어렵고 귀찮은데 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
- Spring 프레임워크에서 @Transactional을 통해 여러 쿼리 관련 코드를 하나의 트랜잭션으로 처리하는 것
- 물리 트랜잭션: 실제 데이터베이스에 적용되는 트랜잭션 단위
- 논리 트랜잭션: 스프링이 트랜잭션 매니저를 통해 처리하는 트랜잭션 단위
- 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋될 수 있다.
- 이렇게 @Transactional은 여러개의 트랜잭션을 묶어 하나의 트랜잭션 경계를 만들 수 있다.
- 일관성(consistency)
- 허용된 방식으로만 데이터를 변경해야 하는 것
- 데이터베이스에 기록된 모든 데이터는 여러가지 조건, 규칙에 따라 유효함을 가져야 한다.
- 예시) A가 1000만원, B가 0원 보유 -> B가 A에게 500만원 송금은 불가
- 격리성(isolation)
- 트랜잭션 수행시 서로 끼어들지 않는 것.
- 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동해야 한다.
- DB는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
- 그냥 순차적으로 하면 쉽지만, 그러면 성능이 떨어진다.
- 격리 수준
- SERIALIZABLE
- 트랜잭션을 순차 실행
- 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다. 매우 엄격한 수준
- 해당 행을 격리시키고 이후 이 행에 대한 트랜잭션이 있으면 대기한다.
- 하지만 교착 상태가 있을 수도 있다.
- REPEATABLE_READ
- 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없게 막아주지만, 새로운 행 추가는 막지 않는다.
- 따라서 이후에 추가한 행이 별견될 수도 있다.
- MySQL 8.0dml innoDB 기본 값이다.
- 팬텀리드 발생
- READ_COMMITED
- 가장 많이 사용되는 격리 수준
- PostgreSQL, SQL server, 오라클에서 기본 값으로 사용된다.
- 트랜잭션에서 커밋되지 않은 정보는 볼수 없다. => 커밋된 정보만 볼 수 있다.
- 하지만, 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능하다. => 다시 읽을 때 값이 달라질 수도 있다.
- 팬텀리드, 반복가능하지 않은 조회 발생
- READ_UNCOMMITED
- 가장 낮은 격리 수준이다.
- 커밋되기 전에도 다른 트랜잭션에 노출되지만, 가장 빠르다.
- 몇몇 행이 제대로 조회가 안되어도 어림잡아 거대한 양을 집계하는데는 좋다.
- 팬텀리드, 반복가능하지 않은 조회, 더티 리드 발생
- 아래로 갈수록 격리 수준은 약해지지만, 동시성은 강해진다.
- 팬텀리드
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때, 해당 조회 결과가 다른 경우
- 예시) A가 age 12 이상인 회원 조회 -> 세개의 결과
- 이후, B가 age 15인 회원 추가 -> 이제 4개의 결과
- 이렇게 조회 결과가 달라지는 경우
- 반복 가능하지 않은 조회
- 한 트랜잭션 내의 같은 행에 두번 이상 조회가 발생했는데, 그 값이 다른 경우
- 예시) 첫 조회와 두번째 조회 사이에 값이 변경되는 경우.
- 더티 리드
- 한 트랜잭션이 실행 중일때, 다른 트랜잭션에 의해 수정되었지만 '아직 커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생한다.
- SERIALIZABLE
- 지속성(durability)
- 성공적인 트랜잭션은 영원히 반영되어야 한다.
- => 장애 발생시 복구
- DB는 이를 위해서 체크섬, 저널링, 롤백 등의 기능을 제공한다.
- 체크섬: 중복 검사의 한 형태, 오류 정정을 통해 송싱된 자료의 무결성 보장
- 저널링: 로그 기록, 커밋되기 전에 로깅, 트랜잭션 등 변경 사항에 대해 로깅
무결성
데이터의 정확성, 일관성, 유효성을 유지하는 것
- 개체 무결성
- 기본 키로 선택된 필드는 빈 값X
- 참조 무결성
- 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
- 고유 무결성
- 특정 속성에 대해 고유한 값을 가지도록 설정햇으면 그 속성은 모두 고유한 값을 가져야 한다.
- NULL 무결성
- 특정 속성에 대해 NULL 값이 올 수 없다는 조건을 설정했으면 그 속성 값은 NULL이 오면 안된다.
728x90
'CS' 카테고리의 다른 글
4.5 인덱스 (0) | 2024.09.27 |
---|---|
4.4 데이터베이스의 종류 (2) | 2024.09.26 |
4.2 ER Diagram과 정규화 과정 (6) | 2024.09.22 |
4.1 데이터베이스의 기본 (1) | 2024.09.20 |
3.4 CPU 스케줄링 알고리즘 (1) | 2024.09.19 |