- 상황
- 1개 이상의 Thread 에서 동일한 테이블에 데이터 유무 확인하여 insert 하기 위해 read -> 데이터 유무 체크 -> insert 하는 method 에 Transaction 설정. 이때 'Phantom Read' 발생을 막기 위해 Isolation 은 SERIALIZABLE 로 설정 함.
- 12 개의 Thread 로 구동 중 JPA 에서 org.hibernate.exception.LockAcquisitionException 발생. 확인 해보니 이미 Lock 이 걸려 있는데 다른 thread 에서 Lock 획득 하려다가 발생한 Exception 으로 확인하고 처리.
- 처리
- 구글링 해보니 retry 하라는 내용이 많은것으로 보아 retry 로 처리 예정. 아직 안해봄. ㅋ
- Spring-retry 가 처리 방안으로 보임
- 참고
2019년 8월 27일 화요일
@Retryable
Transaction 처리 중 org.hibernate.exception.LockAcquisitionException 발생 하여 처리 한 내용.
@Transactional @Caching 사용시 주의 사항
Spring 에서 @Transactional @Caching 등
Spring AOP(Proxy) 관련 기능 사용중 발생한 문제 처리 중 습득한 지식이다.
Spring AOP(Proxy) 관련 기능 사용중 발생한 문제 처리 중 습득한 지식이다.
- spring aop 의 proxy 종류
- JDK Proxy
- Interface 를 구현한 경우
- CGLIB
- Interface 없이 Class 로 구현한 경우
- Spring 의 기본 사항
- 외부에서 Invocation (호출) 한 method 에만 Proxy 기능 작동
- public method 에만 Proxy 기능 작동
- Self-Invocation (Object 내에서 내부 method 호출) 시 Proxy 기능 작동 안함.
- 처리 방법
- AspectJ 사용
- Spring AOP 의 Weaving 방식을 AspectJ 의 Weaving 방식으로 변경 함으로서 처리함.
- Self-Invocation 시 직접 method 호출이 아닌 자신의 bean 을 사용하여 method 호출
- 가장 간단 하지만 private method 호출 불가
- ex)
- @Autowired
- private SomeObject self;
- self.someMethod();
- 참고 사이트
피드 구독하기:
글 (Atom)