2012-10-16 3 views
2

다음 코드 조각을 참조하십시오.@ Transactionaction이 커밋을 수행하지 않습니다.

@Transactional 
public void saveMembersService(List<Member> list1, List<Member> list2) 
{ 
    saveMembersDAO(list1); // does not perform commit. Why? 
    saveMembersDAO(list2); // does not perform commit. Why? 
} // does perform commit only here! 

@PersistenceContext 
private EntityManager em; 

@Transactional 
public void saveMembersDAO(List<Member> members) 
    throws HibernateException 
{ 
    Iterator<Member> it = members.iterator(); 
    while (it.hasNext()) 
    { 
     Member wsBean = it.next(); 
     em.persist(wsBean); // overall commit will be made after method exit 
    } 
} 

저는 DB로 MySQL을 사용합니다. 위의 메서드 실행 후 MySql 로그를 봅니다. 하지만 난 saveMembersService 메서드 실행 후 커밋을 볼 수 있습니다. 두 개의 트랜잭션 메소드 호출마다 두 개의 커밋이 표시됩니다. 내가 어디서 잘못한거야?

업데이트 1 : 죄송합니다. 서비스 방법에 @Transactional을 (를) 추가하는 것을 잊어 버렸습니다. 그것은

UPDATE 수정되었습니다 2 : 나는 DAO에 대한 Propagation.REQUIRES_NEW 속성을 검사 한 - @Transactional을 사용하면 결과가

답변

3

(서비스 방법에서와와 @Transactional 아웃) 동일 , Spring은 클래스 주위에 프록시를 만들고 내부적으로 호출 된 메소드는 프록시를 통과하지 않습니다.

대신이 작업을 수행해야합니다. Spring 컨텍스트에서 TransactionTemplate을 생성하여이를 정리할 수 있습니다.

@Autowired 
private PlatformTransactionManager transactionManager; 

public void saveMembersDAO(List<Member> members) 
    throws HibernateException 
{ 
    TransactionDefinition txDef = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
    TransactionTemplate txTemplate = new TransactionTemplate(transactionManager, trDef) 

    txTemplate.execute(new TransactionCallbackWithoutResult() { 

     @Override 
     protected void doInTransactionWithoutResult(TransactionStatus status) { 
      Iterator<Member> it = members.iterator(); 
      while (it.hasNext()) 
      { 
       Member wsBean = it.next(); 
       em.persist(wsBean); 
      } 
     } 
    }); 
} 

AspectJ를 사용하고 있고 커밋을 2 개 갖고 싶습니다. saveMembersDAO에서 @Transactional (propagation = Propagation.REQUIRES_NEW)을 사용해야합니다.

+0

제발 내 업데이트를 참조하십시오. –

+0

사실 나는 Propagation으로 확인했습니다. DAO의 REQUIRES_NEW 속성 - 결과가 동일합니다 (서비스 메소드에서 @Transactional과 함께 사용) –

+0

아직 단일 커밋 만 있습니까? –

관련 문제