복붙노트

[SPRING] Spring3의 @Transactional @Scheduled가 DB에 커밋되지 않았습니까?

SPRING

Spring3의 @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. ==============================

    1.당신은 아마 이것을 알아 냈거나 계속 전진했습니다 (나는 그렇게 희망합니다). 그러나 다른 사람들을 위해서 :

    당신은 아마 이것을 알아 냈거나 계속 전진했습니다 (나는 그렇게 희망합니다). 그러나 다른 사람들을 위해서 :

    @Transactional 어노테이션은 스프링에게 원래 ServiceImpl 빈을 'Service'를 구현하는 동적 프록시로 포장하도록 지시한다. (기본적으로 Spring은 구현이 아닌 인터페이스를 프록시 처리한다). 이 프록시는 프록시에서 hourly ()을 호출 할 때 트랜잭션의 생성 및 커밋 / 롤백을 투명하게 처리합니다. 그러나 위의 상황에서 구현에 직접 hourly ()를 호출하면 프록시가 무시되므로 트랜잭션이 없습니다.

    http://blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/

    해결책은

    나는 그것이 충분히 명확한 희망한다!

  2. ==============================

    2.주석 기반 지원을 사용하면 해당 상황에서 작성된 클래스에서만 작동합니다. 내 생각에 ServiceImpl은 트랜잭션 관리자와 동일한 컨텍스트에서 (직접 또는 주석 스캐닝으로) 생성되지 않는다.

    주석 기반 지원을 사용하면 해당 상황에서 작성된 클래스에서만 작동합니다. 내 생각에 ServiceImpl은 트랜잭션 관리자와 동일한 컨텍스트에서 (직접 또는 주석 스캐닝으로) 생성되지 않는다.

  3. ==============================

    3.나도 같은 문제가 있었고 시간을 보냈다. null 값을 확인하지 않은 무관 한 코드에서 dao.update ()를 호출 한 후에 예외가 생겼다는 사실을 깨달았다. 그래서 단순히 트랜잭션을 깨뜨렸다. 봄철에 잘 처리 되었기 때문에 stackTrace 인쇄가 없었습니다 (일부 catch 블록). 나는 그것에 잠시 머물렀다. 그래서 - 거래 방법이 끝날 때까지 완료되는지 확인하십시오. 누군가가 도움이되기를 바랍니다.

    나도 같은 문제가 있었고 시간을 보냈다. null 값을 확인하지 않은 무관 한 코드에서 dao.update ()를 호출 한 후에 예외가 생겼다는 사실을 깨달았다. 그래서 단순히 트랜잭션을 깨뜨렸다. 봄철에 잘 처리 되었기 때문에 stackTrace 인쇄가 없었습니다 (일부 catch 블록). 나는 그것에 잠시 머물렀다. 그래서 - 거래 방법이 끝날 때까지 완료되는지 확인하십시오. 누군가가 도움이되기를 바랍니다.

    요시 레브

  4. from https://stackoverflow.com/questions/5443876/spring3-s-transactional-scheduled-not-committed-to-db by cc-by-sa and MIT license