[SPRING] Spring3의 @Transactional @Scheduled가 DB에 커밋되지 않았습니까?
SPRINGSpring3의 @Transactional @Scheduled가 DB에 커밋되지 않았습니까?
이것은 Spring3의 @Scheduled를 시도한 첫 번째 시간이지만 DB에 커밋 할 수 없다는 것을 알았습니다. 이것은 내 코드입니다.
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
// get xxx from dao , modify it
dao.update(xxx);
}
}
나는 그것이 작동해야한다고 생각하는데, 나는 시간당 시작하고 DB에서 xxx를로드 할 수 있지만 데이터는 DB에 커밋되지 않는다.
tx : annotation-driven은 봄 xml입니다.
<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerApp" />
누군가 내가 여기서 뭘 놓쳤는 지 말해 줄 수 있니?
나는 하나의 '더러운'해결책을 가지고있다 :
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Inject
@Qualifier("transactionManagerApp")
private PlatformTransactionManager txMgrApp;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
final TransactionTemplate txTemplateApp = new TransactionTemplate(txMgrApp);
txTemplateApp.execute(new TransactionCallbackWithoutResult()
{
@Override
protected void doInTransactionWithoutResult(TransactionStatus status)
{
//get xxx from dao
dao.update(xxx);
}
});
}
}
여기서는 잘 작동하지만 코드가 중복되어 읽기가 더 어려워집니다. 나는 왜 TransactionManager가 이전 코드 스 니펫에 주입 (및 열림)되지 않았는지 궁금하다.
고마워요!
해결법
-
==============================
1.당신은 아마 이것을 알아 냈거나 계속 전진했습니다 (나는 그렇게 희망합니다). 그러나 다른 사람들을 위해서 :
당신은 아마 이것을 알아 냈거나 계속 전진했습니다 (나는 그렇게 희망합니다). 그러나 다른 사람들을 위해서 :
@Transactional 어노테이션은 스프링에게 원래 ServiceImpl 빈을 'Service'를 구현하는 동적 프록시로 포장하도록 지시한다. (기본적으로 Spring은 구현이 아닌 인터페이스를 프록시 처리한다). 이 프록시는 프록시에서 hourly ()을 호출 할 때 트랜잭션의 생성 및 커밋 / 롤백을 투명하게 처리합니다. 그러나 위의 상황에서 구현에 직접 hourly ()를 호출하면 프록시가 무시되므로 트랜잭션이 없습니다.
http://blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/
해결책은
나는 그것이 충분히 명확한 희망한다!
-
==============================
2.주석 기반 지원을 사용하면 해당 상황에서 작성된 클래스에서만 작동합니다. 내 생각에 ServiceImpl은 트랜잭션 관리자와 동일한 컨텍스트에서 (직접 또는 주석 스캐닝으로) 생성되지 않는다.
주석 기반 지원을 사용하면 해당 상황에서 작성된 클래스에서만 작동합니다. 내 생각에 ServiceImpl은 트랜잭션 관리자와 동일한 컨텍스트에서 (직접 또는 주석 스캐닝으로) 생성되지 않는다.
-
==============================
3.나도 같은 문제가 있었고 시간을 보냈다. null 값을 확인하지 않은 무관 한 코드에서 dao.update ()를 호출 한 후에 예외가 생겼다는 사실을 깨달았다. 그래서 단순히 트랜잭션을 깨뜨렸다. 봄철에 잘 처리 되었기 때문에 stackTrace 인쇄가 없었습니다 (일부 catch 블록). 나는 그것에 잠시 머물렀다. 그래서 - 거래 방법이 끝날 때까지 완료되는지 확인하십시오. 누군가가 도움이되기를 바랍니다.
나도 같은 문제가 있었고 시간을 보냈다. null 값을 확인하지 않은 무관 한 코드에서 dao.update ()를 호출 한 후에 예외가 생겼다는 사실을 깨달았다. 그래서 단순히 트랜잭션을 깨뜨렸다. 봄철에 잘 처리 되었기 때문에 stackTrace 인쇄가 없었습니다 (일부 catch 블록). 나는 그것에 잠시 머물렀다. 그래서 - 거래 방법이 끝날 때까지 완료되는지 확인하십시오. 누군가가 도움이되기를 바랍니다.
요시 레브
from https://stackoverflow.com/questions/5443876/spring3-s-transactional-scheduled-not-committed-to-db by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] <constructor-arg>를 Spring Annotation으로 대체한다. (0) | 2019.03.28 |
---|---|
[SPRING] 스프링 타이머 실행을 취소하는 방법 (0) | 2019.03.28 |
[SPRING] 정적 와이어 스프링 클래스 (0) | 2019.03.28 |
[SPRING] 비 스프링 컨텍스트에서로드 된 스프링 빈 확인 (0) | 2019.03.28 |
[SPRING] @injectMocks와 @Mockito의 @Autowired 사용법의 차이점은 무엇입니까? (0) | 2019.03.28 |