2014-03-12 3 views
0

다음 DAO를 사용하여 여러 DAO를 사용하여 다음과 같은 작업 단위를 수행하는 서비스가 있습니다. DAO는 세션을 만들고 커밋하여 데이터/저장을 가져옵니다. 이 경우 왜 DAO가 세션을 자체적으로 관리 할 때 서비스에 트랜잭션이 필요합니까? 두 번째 DAO에서 문제가 발생하면 첫 번째 DAO의 데이터가 이미 커밋 된 상태에서이 상황을 어떻게 해결할 수 있습니까?서비스에서 @Transactional을 사용하는 적절한 방법

@Transactional 
public boolean testService(SomeObject obj){ 

    userDao.save(obj.getUser()); // this dao gets the session from sessino factory and commits there itself. 
    addressDao.save(obj.getAddress()); // something fails here, and the above line has already commited the data, so the data is not Atomic. 

    return true; 
} 

답변

3

보통 @Transactional은 DAO 레이어가 아니라 서비스 레이어에 넣습니다. 그래서 DAA에서 @Transactional을 제거하고 서비스에 보관하는 것이 좋습니다.

DAO에서 문제가 발생하면 모든 것이 롤백됩니다.

그러나 트랜잭션을 시작하고 끝내기를 원하는 것은 사용자에게 달려 있습니다.

+0

그래서 단일 트랜잭션이 여러 세션에 걸쳐있을 수 있다고 말하고 있습니까? – Zeus

+0

userDao와 addressDao가 동일한 세션을 사용한다고 가정합니다. 그렇지 않다면 이유가 있습니까? (보통 모든 DAO에 대해 동일한 세션을 사용하기 때문에) – TheEwook

+0

DAO간에 세션을 공유하는 방법을 설명 할 수 있다면 내 시스템 설계 방법을 변경하려고합니다. 그러면 도움이 될 것입니다. Thanks – Zeus