본문 바로가기

공부기록/JPA

transaction isolation level

transaction isolation level에는 read uncommitted, read committed, non-repeatable read, serializable이 있습니다.

 

read uncommitted는 트랜잭션이 두개가 동시에 실행중이라고 가정했을 때, 한 곳에서 수정한 entitiy를 커밋하기도 전에 다른 트랜잭션에서 값을 읽어올 때, 수정된 값을 받아올 수 있습니다. 이런 문제를 dirty read라고 합니다.

 

read committed는 commit 된 entitiy만 읽어오므로, dirty read의 문제는 해결하였습니다. 하지만, 트랜잭션을 동시에 실행중이고 A트랜잭션에서 select, B트랜잭션에서 update, A트랜잭션에서 select를 했다고 했을때, 동일한 A 트랜잭션에서 하나의 동일한 select 문으로 항상 같은 결과가 나와야하는데, update한 이후로, update한 값이 나올 수 있습니다. 이런 것을 non repeatable read라고 합니다. 

 

repeatable read에서는 이러한 non-repeatable read의 문제는 해결되었습니다. 하지만, 비슷한 상황에서 select한 값은 하나로 나오다가, 나중에 update한 값이 나타나는 phantom read 현상이 나타날 수 있습니다.

 

serialiazable은 phantom read가 발생하지 않습니다. 가장 높은 레벨이지만, 동시성이 낮아서, 실제로는 거의 사용하지 않습니다.

 

 

추천되는 전략은 read committed를 사용하는 것인데, 여기서 더 고립 레벨을 올리려면, 낙관적인 락이나 비관적인 락을 사용하는 것입니다. 낙관적인 락은 애플리케이션 수준의 락으로 엔티티에 버전정보를 사용하는 것입니다. 비관적인 락은 DB수준에서 락을 거는 것입니다. 낙관적인 락이 일반적으로 성능은 더 좋을 수 있겠지만, 문제상황에서 롤백처리가 좀더 까다로울 수 있습니다.

'공부기록 > JPA' 카테고리의 다른 글

트랜잭션 격리 수준  (0) 2021.12.20
IdClass vs EmbeddedId  (0) 2021.12.20
JPA 면접 대비 공부중  (0) 2021.11.20
자바 ORM 표준 JPA 프로그래밍 #1~5  (0) 2021.05.03