首页 > 解决方案 > 使用spring注解@Transactional(rollbackFor = Exception.class)不能回滚事务,发生异常时

问题描述

// NewParameterService.class
@Override
@Transactional(rollbackFor = Exception.class)
public NewParameter createNewParameter(NewParameterCreateRequest request) throws EntityNotFoundException {
    // newParameterDao.createNewParameter(request, dataSetId) An exception was thrown
    // but newParameterDao.createNewParameter(request, dataSetId) had inserted can not rollback
    NewParameter newParameter = newParameterDao.createNewParameter(request, dataSetId);
    newParameterValueDao.saveNewParameterValues(newParameter.getId(), values);
    return newParameter;
}


//NewParameterDao.class
@Autowired
@Qualifier("paramterJdbcTemplate")
private JdbcTemplate paramterJdbcTemplate;
@Override
public NewParameter createNewParameter(NewParameterCreateRequest request, Long datasetId) {
    String sql = "INSERT INTO new_parameters(name) VALUES (?,?,?,?,?) RETURNING id";
    final Long newParameterId = paramterJdbcTemplate.queryForObject(sql,
            new Object[]{request.getName()},
            Long.class);
    return NewParameter.builder()
            .name(request.getName())
            .id(newParameterId)
            .build();
}



//paramterJdbcTemplateConfig.class
@Bean
public JdbcTemplate paramterJdbcTemplate() {
    HikariDataSource dataSource = new HikariDataSource();

    dataSource.setJdbcUrl("jdbc:postgresql://127.0.0.1:15432/pipeline_schema");
    dataSource.setUsername("postgres");
    dataSource.setPassword("123456");
    dataSource.setDriverClassName("org.postgresql.Driver");
    return new JdbcTemplate(dataSource);
}



//newParameterValueDao.class

@Override public void saveNewParameterValues(long parameterId, List values) { datasetsSchemaJdbcTemplate.batchUpdate(SQL_STUDENT_INSERT, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement PreparedStatement, int i) 抛出 SQLException {preparedStatement.setLong(1, parameterId);preparedStatement。 setString(2, values.get(i).getValue());preparedStatement.setBoolean(3, values.get(i).isDefaultValue());}

        public int getBatchSize() {
            return values.size();
        }

    });
 }

标签: springjdbctemplate

解决方案


推荐阅读