Lewis's Tech Keep

[Database] Spring Boot에서 Isolation level은 transaction 단위로 작동하는가? 본문

Database

[Database] Spring Boot에서 Isolation level은 transaction 단위로 작동하는가?

Lewis Seo 2023. 1. 8. 01:17

Spring Boot에서 Isolation level은 transaction 단위로 작동하는가?

  • annotation으로 설정한 순간 Isolation enum의 TransactionDefinition interface의 value를 가지게 된다.
  • TransactionDefinition interface에 설정된 IsolationLevel int 값을 보고 해당 TransactionIsolationLevel을 set 해준다.
  • setCurrentTransactionIsolationLevel 설정 되는 형태
    • Transaction 실행 시
    • AbstractReactiveTransactionManager 에서 prepareSynchronization 를 통해 setCurrentTransactionIsolationLevel 에 IsolationLevel이 설정된다.

prepareSynchronization 이 실행되는 경로

  • MultiTransactionStatus registerTransactionManager 발생

다음으로

  • AbstractPlatformTransactionManager getTransaction

 

다음으로

  • AbstractPlatformTransactionManager startTransaction

다음으로

  • prepareSynchronization 도착 후 isolationLevel 설정
  • getTransaction → handleExistingTransaction
  • handleExistingTransaction 내부
  • currentIsolationLevel

commit

 
  • DataSourceUtils prepareConnectionForTransaction

 


ReadOnly = true 일 때, isolationLevel을 설정하는 경우 ex. Serializable로 동작하는가?

  • 결론 : No

  • 내부 동작에서 suspend 후 isolationLevel을 지워버린다.

  • 해당 부분은 디버거를 찍어가면서 체크

 


Repeatable Read 일 때 트랜잭션 도중 새로운 값이 들어올 경우 다시 읽는가?

 

 


PostgresQL에서 Repeatable Read를 적용할 경우 Phantom Read를 허용하지 않는다는데 이는 Serializable과 같은가?

 


최종 결론

 

  • readonly = false, isolationLevel = Serializable 로 설정한 경우에만
    해당 고립 레벨에 대한 요청이 jdbc 쪽에 저장되는 것을 확인

  • 해당 패턴 해결 필요 시 readonly = false, isolationLevel = Serializable 설정 필요

  • serializable 해야하는 트랜잭션이 생긴다면 read에 Lock을 걸게 되는데
    이를 거는 것은 데드 락 발생 가능성 및 여러 사이드 이펙트를 유발할 가능성이 생긴다.
    • 따라서 다른 방법을 고민해보고 마지막으로 안될 때 해당 방법으로 하는 것을 고려해야 한다.

 


연계 사항

 


 

Comments