Search
Duplicate

[Java] @Transcation 롤백 안되는 현상 발생 2[프록시]

순서
7
날짜
2023/08/14
사람
상태
Done
8월 11일
오늘은 이전에 이야기했던 트랜잭션 프록시 관련 문제가 발생하였다.
지난주에 작성했는데, 이렇게 문제가 발생되다니, 너무 아닐 하게 생각하였나 보다..
다시한번 실수 하지 않기 위해 작성하려고 한다.
[문제발생]
상품 검수하는 웹사이트를 유지 보수하고 있는데, 상품에 대해서 일괄 검수하는 프로세스의 기능을 API 연동하기로 하였다. 기존에는 내부적으로만 처리하고 API로 연동하지 않고 있어서, 이 부분에서 추가로 작업하는 부분이었는데, Service layer에서[@Transacation 함수 → 일반 함수 → @Transacation 함수]를 호출하게 되어 있는 것이다. 기존에 잘 된다고 생각되어 살을 붙였는데, 그게 화근이 된 것 같다. 좀 더 분석하고 깔끔하게 처리하자!
Plain Text
복사
[해결방법]
현재 DDD로 구현되어 있지 않기 때문에 빠르게 대응하기 위해 TransactionInnerService를 만들어 프록시로 함수로 만들어줄 생각이다. 트랜잭션이 어떻게 걸렸었는지 눈으로 확인하고, 차주에 작업 후에 잘 되는지 올리도록 하겠다. 참고 트랜잭션 확인하는 함수 : String transactionName = TransactionSynchronizationManager.getCurrentTransactionName();
Java
복사
8월 14일
[트랜잭션을 직접적으로 확인 해본 결과]
@Transacation 함수 → 일반 함수 → @Transacation 함수일 경우 [트랜잭션1 → 트랜잭션1 → null] 로 진행이 된다. 때문에 3번째 트랜잭션에서는 트랜잭션 1과 상관없이 일반 함수 처럼 동작하게 되는 것이다. 이를 해결 하기위해 TransactionInnerService 레이어를 한개 더 만들고, 내부로 함수로 옮기니 트랜잭션이 따로 걸리는 것을 확인하였다.
Plain Text
복사
오늘은 트랜잭션의 프록시에 대해 정리하게 되었다.
역시 같은 함수 내에서 호출하여 프록시로 인지 못하고 일반 함수로 인지하는 문제였고, 아직 깔끔하게 해결 하지 못하였지만, 그래도 트랜잭션이 각각 잘 동작하였다.
하지만 소스코드의 분리와 명시적으로 처리하는 방법에 대해 좀 더 찾아보고, 좋은 방법이 있다면 추가로 작성하도록 하겠다.