为什么JDBCTEmplate.batchupdate(sql [])方法不能使用@transaction注释在Spring4中回滚?

时间:2014-09-16 10:39:05

标签: spring spring-transactions

当在数据库中插入记录时发生任何异常时,下面的代码不能用于回滚。我正在使用Spring 4框架和注释。

* / 我使用下面的代码进行事务管理,它不会因任何异常而回滚。 /

@Transactional(rollbackFor = RuntimeException.class)
public boolean insertBatch(List<String> query) throws SQLException   {
    boolean flag= false;
    try
    {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        String[] Sql= query.toArray(new String[query.size()]);
        jdbcTemplate.batchUpdate(Sql);

        flag=true;

    }catch(DataAccessException e )
    {
        flag=false;
        MessageResource.setMessages("Constraints Violation ! CSV data value not matched with database constraints  ");
        LOGGER.info("CSV file Data not  expected as  database table structure defination like constraint violation/Data Type lenght/NUll etc for same data value" );
        LOGGER.error( "Cause for error:  "+  e.getRootCause().getMessage());
        LOGGER.debug( "Details explain : "+  e.toString());
        throw new RuntimeException("Roll back operation");
        //transactionManager.rollback(status);

    }
         return flag;


}**

2 个答案:

答案 0 :(得分:2)

先生,M.Deinum提供的Actullay答案如下:

Spring使用代理来应用AOP,这只适用于从外部调用的方法。内部方法调用不通过代理,因此没有事务,并且根据您的查询,您将获得一个大型或多个较小的提交。确保外部方法(调用启动所有内容的方法)是事务性的。 - M. Deinum 14小时前

答案 1 :(得分:0)

@Transactional(rollbackFor = RuntimeException.class)

只有在带注释的方法中抛出RuntimeException或子类时,才会回滚。如果您要回滚任何Exception(例如SQLException a RuntimeException),您应该执行以下操作:

@Transactional(rollbackFor = Exception.class)

如果你想尝试回滚可能发生的任何错误

@Transactional(rollbackFor = Throwable.class)

在最后一种情况下,运行时可能会破坏,甚至连回滚都无法完成。