2017-07-26 93 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

我尝试你提到的但它不起作用 –