최근 스레드 관련한 작업을 하고 있는데,

관련 작업에서 발생했던 이슈에 대해서 공유하고자 글을 씁니다.

 

1. 전체 로직

최초 대상 row를 조회해 thread pool에서 각 row 별로 thread를 할당해 관련 로직을 처리하고,

처리 결과에 따라 최초 조회했던 row의 상태와 결과 값을 update 시킨다.

 

2. 이슈사항

작업에 동일한 시간이 소요되는 작업을 다수 동시에 요청했을 때,

한가지 요청한 작업의 상태와 결과 값만 업데이트되고, 나머지는 업데이트 되지 않음

(이 때, 로그에는 정상적으로 update row count = 1 이 출력되었음)

 

3. 원인

기존에 DefaultTransactionDefinition을 사용하고 있었는데,

트랜잭션 격리수준이 Serializable로 설정되어 있어서, 나머지 트랜잭션이 수행되지 않았다.

 

4. 찾게 된 과정

처음에는 DefaultTransactionDefinition를 DI로 가져와서 싱글톤이라 스레드가 같은 객체를 바라보고 있어서

한 트랜잭션만 실행되고 나머지는 아닌가보다.. 했는데, 아무리 생각해도 아닌거같아 DefaultTransactionDefinition 관련해

찾아보다가 알아낼 수 있었다.

 

4. 해결방법

DefaultTransactionDefinition가 공통으로 사용되고 있는 부분이기 때문에 이 부분을 수정할 수는 없었고,

DefaultTransactionDefinition를 사용하지 않고,

update만 수행한 다음 update 결과에 따라 추가적으로 처리해주는 방어 로직을 구현했다.

+ Recent posts