read uncommitted - 한 프로세스에서 여러개의 트랜잭션이 사용될 때, 하나의 트랜잭션에서 작업을 처리하고, 커밋하지 않았는데, 다른 트랜잭션에서 커밋되지 않은 데이터를 가져와서 읽는 dirty read가 발생할 수 있다.
read committed - dirty read가 발생하지 않는다. non-repeatable read가 발생할 수 있다.
non-reapable read란 읽는 도중에 다른 트랜잭션이 해당 데이터를 변경하는 경우, 동일한 쿼리로 SELECT를 했지만, 두 결과가 다를 수 있다. 하나의 트랜잭션이 진행되는 동안, 동일한 SELECT는 같은 결과를 반환해야하는 데, 그렇지 못하는 것을 non-repeatable read라고 한다.
JPA는 기본적인 트랜잭션 격리 수준을 read committed로 가정한다.
더 높은 격리 수준을 사용하고 싶으면, 그러한 격리 수준을 사용하는 것이 아니라, 긍정적인 락 또는 비관적인 락을 사용하는 것이 추천된다.
낙관적인 락 - 애플리케이션 수준의 락, 버전 정보를 사용하는 것을 의미한다. ( 트랜잭션을 커밋하기 전에 트랜잭션 충돌을 감지할 수 없다.)
비판적인 락 - DB 수준의 락, 트랜잭션 락 메커니즘에 의존하는 방법.(select for update를 사용, 버전정보를 사용하지 않음)
repeatable read - non-repeatable read는 발생하지 않음. phantom read, 조회하는 도중에 insert된 데이터를 읽어 올 수 있음(여러개의 데이터를 읽을 수도..)
serializable - 가장 높은 격리 수준. 한 곳에서 접근시 Lock이 잡힌다.
DB에 같이 접근을 못하게 하지만, 동시성 수준이 가장 낮다. 잘 쓰이지 않는다.
출처 - 김영한 JPA ORM,
'공부기록 > JPA' 카테고리의 다른 글
transaction isolation level (0) | 2021.12.29 |
---|---|
IdClass vs EmbeddedId (0) | 2021.12.20 |
JPA 면접 대비 공부중 (0) | 2021.11.20 |
자바 ORM 표준 JPA 프로그래밍 #1~5 (0) | 2021.05.03 |