** 트랜잭션과 락 : JPA가 제공하는 트랜잭션과 락 기능을 다룬다
** 2차 캐시 : JPA가 제공하는 애플리케이션 범위와 캐시를 다룬다
1. 트랜잭션과 락
트랜잭션은 ACID를 보장해야 한다
- 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하던가 실패해야 한다
- 일관성(Consistency) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
- 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를들어 동시에 같은 데이터를 수정하지 못하도록 해야한다. 격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다.
- 지속성(Durability) : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로글 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
1. 트랜잭션 격리수준
- READ UNCOMMITED (커밋되지 않은 읽기) : 커밋하지 않은 데이터를 읽을 수 있다.
트랜잭션1이 데이터를 수정하고 있는데 커밋하지 않아도 트랜잭션 2가 수정중인 데이터를 조회할 수 있다. 이를
DIRTY READ 라 하며 이는 심각한 문제가 발생할 수 있다.
- READ COMMITED (커밋된 읽기) : 커밋한 데이터만 읽을 수 있다.
따라서 DIRTY READ가 발생하지 않는다. 하지만 트랜잭션 1이 다시 회원 A를 조회중인데 갑자기 트랜잭션2가 회원 A를 수정하고 커밋하면 트랜잭션 1이 다시 회원 A를 조회했을 때 수정된 데이터가 조회된다. 이처럼 반복해서 같은 데이터를 읽을 수 없는 상태를
NON-REAPEATABLE READ 라 한다.