최-코드
2025. 2. 26. 17:29
2025. 2. 26. 17:29
트랜잭션
- 트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다. 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
- 이에 대한 특징은 원자성, 일관성, 격리성, 지속성이 있으며 이를 한꺼번에 ACID 특징이라고 한다.
원자성
- 원자성은 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.
- 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안 된다. 만약 있다면 롤백이 일어났을 때 어떻게 해야 할 것인지에 대한 해결 방법이 있어야 하고 트랜잭션 전파를 신경 써서 관리해야 한다.
일관성
- 일관성은 '허용된 방식'으로만 데이터를 변경해야 하는 것을 의미한다.
- 예를 들어 성별 컬럼에 대해 도메인이 남,여로 나뉘어져 있을 때 '무'와 같은 데이터가 존재하면 안 된다.
격리성
- 격리성은 여러 트랜잭션 수행 시 서로 관여하지 못하는 것을 말한다.
- 격리 수준은 위 사진과 같다.
- SERIALIZABLE: 트랜잭션을 순차적으로 진행시키는 것을 말한다. 즉, 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
- REPEATABLE_READ: 하나의 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다. 이는 MySQL8.0의 innoDB 기본값이다
- 팬텀 리드: 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말한다. 예를 들어 조회된 데이터의 개수가 달라질 수 있다.
- READ_COMMITTED: PostgreSQL에서 기본값으로 설정되어 있다. 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다. 즉, 커밋 완료된 데이터에 대해서만 조회를 허용한다. 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다.
- 커밋하지 않은 정보란, 새로 추가되거나, 수정되거나 삭제된 정보들을 말한다.
- 이 때 추가, 수정, 삭제시에 행 수준 베타적 락이 걸리며 다른 트랜잭션이 읽을 수 없는 것이다.
- 하지만 postgreSQL은 mvcc를 지원하므로 해당 작업이 이뤄지지 않은 이전 버전의 데이터를 읽을 수 있다.
- 반복 가능하지 않은 조회: 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 가리킨다.
- READ_UNCOMMITTED: 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있어, 데이터 무결성이 위배될 수 있지만 가장 빠르다.
- 더티 리드: 커밋되지 않은 내용이 조회되는 것을 말한다.
지속성
- 지속성은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다.
- 이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻하며, 데이터베이스는 이를 위해 저널링, 등의 기능을 제공한다.
- 저널링: 트랜잭션 등 변경 사항에 대한 로그를 남기는 것
무결성
- 무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말한다.
- 무결성 종류
- 개체 무결성: 기본키로 선택된 필드는 null 값을 허용하지 않는다.
- 참조 무결성: 부모 테이블에 존재하는 기본키 값 또는 null 값만을 가져야 한다.
- 고유 무결성: 필드값이 모두 고유한 값을 가져야 한다. null이 들어갈 수 있다.
- null 무결성: 필드값이 null이 될 수 없다는 제약 조건이다.