mingg IT

[Jpa] @transactional 격리수준과 전파속성 본문

BackEnd

[Jpa] @transactional 격리수준과 전파속성

mingg123 2021. 12. 26. 17:54

우선 우리가 아는 @transactional annotation은 붙여주게되면 해당 메소드 시작부터 메소드 끝까지 하나의 transaction으로 관리하게 됨을 의미한다.

 

조금 자세히 공부해보니 해당 개념을 정확히 알지못하면  유지보수나 이슈 해결에 어려움을 겪을것 같아  정리해 두려고 한다.

 

우선 격리수준, 전파속성 두가지에 대해 알아보려고 한다.

 

출처 https://feco.tistory.com/45

격리수준 

 

Read uncommitted

transaction이 아직 끝나지 않은 경우에 다른 transaction이 데이터를 읽을 수 있는 상황

Transaction lock 발생 가능성 있음.

만약 commit을 하지않고 rollback을 하게된다면?

Update 된 값을 보여줌. Dirty data를 보여줌(rollback 이 안먹음) 

-> 해결법은  entity에 @DynamicUpdate 사용

일반적으로 많이 사용안함

 

Read committed 

-> dirty data 발생하지 않음

 

그렇다면 read commited는 문제가 없을까 ? 

JPA 영속성 컨텍스트의 1차캐시기능으로 인해 phantom read 문제가 발생한다. 

 

 

SERIALIZABLE 

read uncommit, read commited 의 문제를 모두 해결할 수 있지만 성능상의 문제로 잘 사용하지 않는다.

 

현업에서 Read uncommitted, SERIALIZABLE 은 잘 사용하지 않음

 

전파속성 

여러 transaction간의 교통정리를 해줌. 즉 여러 메소드에 transaction의 설정이 되어 있을 때 각각 어떤방식으로 동작할 것인지. 

 

Default 는 required 

transaction이 있으면 사용하고 없으면 만들어서 사용하고. Save 메소드가 required임.

더 위에서 transaction써주고 내부에서 또 transaction써주면 하나가 exception발생하면 둘다 rollback됨

 

Requires new 

매번 transaction을 생성하기 때문에 별도의 transaction이라고 판단함. 

 

Nested

하나의 transaction 이지만 분리되어서 사용됨 

종속적이지만 상위에 영향을 주지 않는다는 것이 (requires new와의 차이점)

 

 

 

 

 

Comments