아래 글의 트랜잭션 처리와 관련하여 내가 겪었던 상황을 살펴볼까한다.
- 삽질했던 상황 -
DB로부터 목록을 조회한 후 목록안의 개별 아이템에 대한 작업을 수행한 뒤
개별 아이템별로 작업결과를 DB에 반영한다.
개별 아이템별로 작업결과를 DB에 반영한다.
로직은 별로 복잡하지 않다. 근데 문제는 이거 2가지다.
- 전체 작업이 아니라 개별 작업결과를 커밋하길 원한다.
- 개별 작업은 1~10초 정도 시간이 걸리는 네트워크 작업이다.
처음에 아래처럼 코드를 작성했다.
public void 전체작업() {
전체 목록 조회;
for (아이템 : 전체목록) {
try {
아이템작업(아이템);
} catch(에러) {
//로깅
}
}
}
public void 아이템작업(아이템) throws 네트워크에러, DB에러 {
네트워크작업(아이템);
작업결과처리(아이템);
}
@Transactional
private void 작업결과처리(아이템) {
// 아이템 가공
dao.save(아이템);
}
전체 목록 조회;
for (아이템 : 전체목록) {
try {
아이템작업(아이템);
} catch(에러) {
//로깅
}
}
}
public void 아이템작업(아이템) throws 네트워크에러, DB에러 {
네트워크작업(아이템);
작업결과처리(아이템);
}
@Transactional
private void 작업결과처리(아이템) {
// 아이템 가공
dao.save(아이템);
}
나름 트랜잭션 스코프도 최소화하고 독립적으로 개별 아이템작업을 처리하기 위해 신경썼는데,
무지막지하게 삽질을 해댔으니... RTFM이 떠오른다.
이제 위 코드에서 왜 트랜잭션이 작동하지 않는지 이유를 알았으니 해결방안을 찾아야겠다.
'Framework' 카테고리의 다른 글
링크 : 어노테이션 기반 validation (0) | 2008.04.12 |
---|---|
하이버네이트 늦은로딩은 영속상태에서만 가능하다. (2) | 2008.04.07 |
스프링에서 @Transactional 사용시 주의점 (2) | 2008.04.04 |
기선님의 하이버네이트3 요약 시리즈 (2) | 2008.03.28 |
Spring+Hibernate 조합에서 테스트시 주의점 (0) | 2008.03.28 |