当在数据库中插入记录时发生任何异常时,下面的代码不能用于回滚。我正在使用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;
}**
答案 0 :(得分:2)
Spring使用代理来应用AOP,这只适用于从外部调用的方法。内部方法调用不通过代理,因此没有事务,并且根据您的查询,您将获得一个大型或多个较小的提交。确保外部方法(调用启动所有内容的方法)是事务性的。 - M. Deinum 14小时前
答案 1 :(得分:0)
@Transactional(rollbackFor = RuntimeException.class)
只有在带注释的方法中抛出RuntimeException或子类时,才会回滚。如果您要回滚任何Exception
(例如SQLException
,不 a RuntimeException
),您应该执行以下操作:
@Transactional(rollbackFor = Exception.class)
如果你想尝试回滚可能发生的任何错误
@Transactional(rollbackFor = Throwable.class)
在最后一种情况下,运行时可能会破坏,甚至连回滚都无法完成。