当在数据库中插入记录时发生异常时,下面的代码不适用于回滚。我使用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;
}**发布于 2014-09-17 04:37:40
由Sir、M.Deinum提供的Actullay如下:
Spring使用代理来应用AOP,这只适用于外部调用的方法。内部方法调用不会通过代理,因此不会进行事务处理,根据查询的不同,您将得到一个较大或多个较小的提交。确保外部方法(调用启动一切的方法)是事务性的。- 14小时前
发布于 2014-09-16 10:44:59
@Transactional(rollbackFor = RuntimeException.class)只有当从带注释的方法引发RuntimeException或子类时,这才会回滚。如果您想回滚任何Exception (例如SQLException,即而不是a RuntimeException),您应该这样做:
@Transactional(rollbackFor = Exception.class)如果您想要对可能发生的任何错误进行回滚
@Transactional(rollbackFor = Throwable.class)同样,在最后一种情况下,运行时可能会被破坏到连回滚都无法完成。
发布于 2022-02-05 10:50:00
使用来自connection对象的预准备语句和do执行批处理对象。在连接对象上使用conn.setAutoCommit(false)。对于1000条记录的批量插入,前置语句的性能是JdbcTemplate的4倍。
https://stackoverflow.com/questions/25866593
复制相似问题