2017-07-26 131 views
0

我有一個春季啓動應用程序和使用駱駝與它,我讀了一個文件,然後我嘗試插入我的數據庫,一切都運行良好唯一的問題是,我嘗試使用@transactionaltransactionTemplate使回滾時發生錯誤,但它不會使回滾,如何管理在春季啓動交易

隨着@transactional我添加到我的SpringBootApplication和@EnableTransactionManagement(proxyTargetClass=true)在我的課我添加@Transactional(rollbackFor = Exception.class)

這些都是我的類:

@SpringBootApplication 
@EnableDiscoveryClient 
@EnableTransactionManagement(proxyTargetClass=true) 
public class MsArchivo510Application { 

    public static void main(String[] args) { 
     SpringApplication.run(MsArchivo510Application.class, args); 
    } 
} 

@Service 
public class ArchivoBS implements Processor{ 
    @Transactional(rollbackFor = Exception.class) 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     //Here I execute stored procedure and one of them fail 
    } 
} 

隨着transactioTemplate我的課結束這樣的:

@Service 
public class ArchivoBS implements Processor{ 
    @Override 
    public void process(Exchange exchange) throws Exception { 

     transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

      @Override 
      protected void doInTransactionWithoutResult(TransactionStatus status) { 
      try { 
       //Here I execute stored procedure and one of them fail 
      } catch (Exception e) { 
       e.printStackTrace(); 
       status.setRollbackOnly(); 
      } 
     } 
     }); 
    } 
} 

難道我失去了一些東西?有人可以幫助我這個問題?提前

感謝

回答

0

當時我注意到,我需要指定我的數據源中的DataSourceTransactionManager結束後,我與註釋@Configuration一類,有我可以創造數倍的數據源,所以我的課是這樣的:

@Configuration 
public class Configuracion { 

    @Bean(name = "mysqlNocturno") 
    @ConfigurationProperties(prefix = "spring.nocturno") 
    public DataSource mysqlDataSourceNocturno() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "jdbcTemplateNocturno") 
    public JdbcTemplate jdbcTemplateNocturno(@Qualifier("mysqlNocturno") DataSource dsMySQL) { 
     return new JdbcTemplate(dsMySQL); 
    } 

    @Bean(name = "mysqlProduccion") 
    @Primary 
    @ConfigurationProperties(prefix = "spring.produccion") 
    public DataSource mysqlDataSourceProduccion() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "jdbcTemplateProduccion") 
    public JdbcTemplate jdbcTemplateProduccion(@Qualifier("mysqlProduccion") DataSource dsMySQL) { 
     return new JdbcTemplate(dsMySQL); 
    } 

} 

文檔提到註釋@EnableTransactionManagement需要對我的SpringBootApplication類添加,但不是必要的,它需要對我的配置類加入,所以我的課結束這樣的:

@Configuration 
@EnableTransactionManagement 
public class Configuracion { 

    @Bean(name = "mysqlNocturno") 
    @ConfigurationProperties(prefix = "spring.nocturno") 
    public DataSource mysqlDataSourceNocturno() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "jdbcTemplateNocturno") 
    public JdbcTemplate jdbcTemplateNocturno(@Qualifier("mysqlNocturno") DataSource dsMySQL) { 
     return new JdbcTemplate(dsMySQL); 
    } 

    @Bean(name = "transactionManagerNocturno") 
    public PlatformTransactionManager transactionManagerNocturno() { 
     return new DataSourceTransactionManager(mysqlDataSourceNocturno()); 
    } 

    @Bean(name = "mysqlProduccion") 
    @Primary 
    @ConfigurationProperties(prefix = "spring.produccion") 
    public DataSource mysqlDataSourceProduccion() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "jdbcTemplateProduccion") 
    public JdbcTemplate jdbcTemplateProduccion(@Qualifier("mysqlProduccion") DataSource dsMySQL) { 
     return new JdbcTemplate(dsMySQL); 
    } 

    @Bean(name = "transactionManagerProduccion") 
    public PlatformTransactionManager transactionManagerProduccion() { 
     return new DataSourceTransactionManager(mysqlDataSourceProduccion()); 
    } 

} 

有了這個配置我只需要@Transactional註釋添加到我的課像@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) 
@Override 
public void altaArchivo(Mensaje objMensaje, ArchivoCarnet objArchivoCarnet, ArchivoCarnetTrailer objArchivoCarnetTrailer, List<ArchivoCarnetDetalle> lstArchivoCarnetDetalle) { 

    if (objMensaje.getStrCodigo().equals(ArchivoErrorEnum.OPERACION_EXITOSA.getStrCodigo())) { 
     archivoDAO.altaArchivoCarnet(objArchivoCarnet); 
     archivoDAO.altaArchivoCarnetTrailer(objArchivoCarnetTrailer); 
     archivoDAO.altaArchivoCarnetDetalle(lstArchivoCarnetDetalle); 
    } else { 
     archivoDAO.altaBitacoraArchivo510(new BitacoraArchivo510(objMensaje, objArchivoCarnet.getStrNombre())); 
    } 

} 

希望這有助於別人:)

0

你在駱駝環境和Spring引導可能難以正常工作。 您可以嘗試在Spring服務中進行事務操作並將其注入到處理器中,然後在您的服務方法中添加@Transaction並從處理器中調用它。

+0

所以你的意思是有從存儲過程的調用分離處理器? –

+0

我嘗試你提到的但它不起作用 –