트랜잭션과 JPA에서 제공하는 낙관적 락, 비관적 락
ACID
atomicity: 트랜잭션 내에서 실행하는 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다.
consistency: 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야함.
isolation: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리한다.
동시에 같은 데이터 수정 못하게
durability: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다.
중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션 격리 수준 오름차순 정렬
Markdown table:
https://www.tablesgenerator.com/markdown_tables
격리수준 | DIRTY READ | NON-REPEATABLE | PHANTOM READ |
---|---|---|---|
READ UNCOMMITTED | v | v | v |
READ COMMITTED | v | v | |
REPEATABLE READ | v | ||
SERIALIZABLE |
■NON-REPEATABLE READ(반복불가능한읽기)
용어정리
READ UNCOMMITTED: 커밋하지 않은 데이터를 읽을 수 있다.
DIRTY READ: 트랜잭션 1이 수정중 커밋 안하면 트랜잭션 2가 수정중인 데이터 조회 가능
DIRTY READ를 허용하는 단계다.
READ COMMITTED: 커밋한 데이터만 읽을 수 있다.
트랜잭션 1이 회원 A를 조회중 트랜잭션 2가 회원 A를 수정하고 커밋하면 트랜잭션 1이 다시 A를 조회했을 때 수정된 데이터가 조회된다.
반복해서 같은 데이터를 읽을 수 없은 상태 NON-REPEATABLE READ
NON-REPEATABLE READ이 가능한 상태
REPEATABLE READ : 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다. 하지만 PHANTOM READ가 발생함.
트랜잭션 1이 10살 이하의 회원을 조회함. 트랜잭션 2가 5살 회원을 추가하고 커밋하면 트랜잭션 1이 다시 10살 이하의 회원을 조회했을때 회원 하나가 추가된 상태로 조회된다.
이처럼 반복 조회시 결과 집합이 달라지는 것을 PHANTOM READ
PHANTOM READ가 가능한 상태
SERIALIZABLE : 가장 엄격한 트랜잭션 격리 수준, 하지만 동시성 처리 성능이 급격히 떨어질 수 있다.
애플리케이션 대부분은 동시성 처리가 중요하므로 데이터베이스드은 보통 READ COMMITTED 격리 수준을 기본으로 사용한다.
JPA의 영속성 컨텍스트 (1차 캐시)