4.3 트랜잭션과 무결성
2026-06-07
스터디를 함께 진행했음
트랜잭션
트랜잭션 : 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 여러 개의 쿼리들을 하나로 묶는 작업 단위
ACID 특징
- 원자성 : “all or nothing”. 트랜잭션과 관련된 일이 모두 수행되거나 혹은 수행되지 않아야 한다.
- 일관성 : 허용된 방식으로만 데이터를 변경해야 하는 것. 규칙에 맞는 데이터만 반영해야 한다.
- 격리성 : 각 트랜잭션들이 서로 끼어들지 못하는 것을 말함. 여러 개의 격리 수준으로 나눠서 격리성을 보장한다.
- 지속성 : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다. 시스템 장애가 발생하더라도 원래 상태로 돌아갈 수 있는 회복 기능이 있어야 함을 의미함.
커밋과 롤백 : 데이터의 무결성이 보장되게 하는 개념
- 커밋 : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어. 트랜잭션 단위로 진행되고, DB에 변경사항을 저장한다.
- 롤백 : 트랜잭션으로 처리한 하나의 과정 묶음을 일어나기 전으로 돌리는 일.
트랜잭션 전파 : 트랜잭션을 수행할 때 커넥션 단위로 수행. 그래서 커넥션 객체를 매번 넘겨줘야 한다. 근데 그게 되게 번거로움. 그래서 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
격리 수준과 그에 따라 발생하는 현상

격리 수준
- SERIALIZABLE : 트랜잭션을 순차적으로 진행시키는 것. 매우 엄격한 격리수준이므로 교착상태가 일어날 가능성이 높고 성능이 떨어진다.
- REPEATABLE_READ : 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할수는 없지만, 새로운 행은 추가할 수 있는 격리 수준. 추가된 행을 나중에야 발견하게 될 수도 있다.
- READ_COMMITTED : 가장 많이 사용되는 격리 수준. 다른 트랜잭션이 커밋한 정보만 읽을 수 있는 격리 수준. 트랜잭션이 접근했던 행에 뒤늦게 커밋할 수도 있으므로 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있다.
- READ_UNCOMMITTED : 가장 낮은 격리 수준. 가장 빠르다. 정확성을 포기하면서까지 빠른 성능이 필요할 때 사용할 수 있다.
격리 수준에 따라 발생하는 현상
- 팬텀 리드 : 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우.
- 반복 가능하지 않은 조회 : 한 트랜잭션 내의 같은 행에 두번 이상의 조회가 발생했을 때, 그 값이 다른 경우.
- 더티 리드 : 트랜잭션이 수행했지만 아직 커밋하지 않은 결과를 다른 트랜잭션이 읽을 수 있는 경우.
반복 가능하지 않은 조회 : “같은 행” 인데 결과가 다른 경우
팬텀 리드 : “같은 쿼리” 인데 결과가 다른 경우
무결성
무결성 : 데이터의 정확성, 일관성, 유효성을 유지하는 것.
- 개체 무결성 : 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
- 참조 무결성 : 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
- 고유 무결성 : 특정 속성에 대해 고유한 값을 갖도록 조건이 주어진 경우, 그 조건을 잘 만족해야 한다.
NULL 무결성이 책에 있긴 한데 일반적인 용어는 아니라고 함…