I'm trying to unable the autocommit in some methods in order to make them transactional. I use spring JDBC Template.
I tried to use de @Transactional annotation but another web applications depending from this one stopped working correctly, so I tried something different. I tried to get the connection from the template, and set the autocommit to false manually.
The problem is, I don't think it's disabled at all. I have an insert method, and at the end of it, in order to test, i do a rollback instead of a commit.
In the JUnit test, I try to recover an object with an Id that doesn't exist, it returns nothing. Then I create an object with that Id, and try to insert it. It should return nothing, because the insert method does a rollback, but it returns the object I inserted.
Here is some code.
Data Source bean:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<property name="resourceRef" value="true" />
</bean>
Declaration of Data Source in the DAO that does the insert:
@Autowired
public final void setDataSource(final DataSource pDataSource) {
this.jdbcTemplate = new JdbcTemplate(pDataSource);
}
Insert method:
public final void insertProcedimiento(final Procedimiento pProcedimiento) throws DataManipulationException, SQLException {
/**
* Se obtiene la conexión a partir del DataSource.
*/
final DataSource ds = jdbcTemplate.getDataSource();
final Connection conexion = DataSourceUtils.getConnection(ds);
try {
//Se establece el AutoCommit como false para hacer rollback en caso de que haya algún error al insertar el procedimiento
conexion.setAutoCommit(false);
// Instanciación del template de JDBC
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(ds);
// Inicializar el objeto que contendrá los parámetros de la query
this.namedParameters = new HashMap<String, Object>();
final String query = (
"INSERT INTO DEX_PROCEDIMIENTO(PRO_CODIGO_INTERNO,PRO_CODIGO_SIA,PRO_TIPO_TRAMITE,PRO_INTERNO,PRO_ES_COMUN,PRO_DENOMINACION,PRO_DESCRIPCION,PRO_OBSERVACIONES,PRO_COD_ORG_RESPONSABLE_N1,"
+ "PRO_COD_ORG_RESPONSABLE_N2,PRO_UNIDAD_GESTORA_TRAMITE,PRO_COD_ORGANICA,PRO_SUJETO_TASAS,PRO_PERIODICIDAD,PRO_COD_CLASE_TRAMITE,PRO_CLASIFICACION_ARCHIVO,PRO_REQUISITOS_INICIACION,"
+ "PRO_PRESENCIAL_NO_ADAPTABLE,PRO_COD_NIVEL_AE,PRO_COD_REQUISITOS_IDENT_PJ,PRO_COD_REQUISITOS_IDENT_PF,PRO_ID_INTEGRADO_CLAVE,PRO_OBS_INTEGRADO_CLAVE,PRO_ENLACE_WEB,PRO_PORTAL,"
+ "PRO_FORMA_INI_INTERESADO,PRO_COD_SILENCIO_INTERESADO,PRO_FORMA_INI_OFICIO,PRO_COD_SILENCIO_OFICIO,PRO_NUMERO_PLAZO_RESOLUCION,PRO_COD_TIPO_PLAZO_RESOLUCION,PRO_FIN_VIA,PRO_PROCEDIMIENTO_AUTORIZACION,"
+ "PRO_RESPONSABLE,PRO_VISIBLE_CIUDADANO,PRO_FECHA_VISIBLE_CIUDADANO,PRO_RESPONSABLE_TECNICO,PRO_FECHA_ALTA,PRO_FECHA_MODIFICACION,PRO_USUARIO_MODIFICACION,PRO_ESTADO)"
+ "VALUES(:iProCodigoInterno, :iProCodigoSia, :sProTipoTramite, :sProInterno, :sProEsComun, :sProDenominacion, :sProDescripcion, :sProObservaciones, :sProCodOrgResponsableN1, :sProCodOrgResponsableN2, "
+ ":sProUnidadGestoraTramite, :iProCodOrganica, :sProSujetoTasas, :iProPeriodicidad, :iProCodClaseTramite, :sProClasificacionArchivo, :sProRequisitosIniciacion, :sProPresencialNoAdaptable, :iProCodNivelAe, "
+ ":sProCodRequisitosIdenPj, :sProCodRequisitosIdenPf, :sProIdIntegradoClave, :sProObsIntegracionClave, :sProEnlaceWeb, :iProPortal, :sProFormaIniInteresado, :iProCodSilencioInteresado, :sProFormaIniOficio, "
+ ":iProCodSilencioOficio, :iProNumeroPlazoResolucion, :iProCodTipoPlazoResolucion, :sProFinVia, :iProProcedimientoAutorizacion, :sProResponsable, :sProVisibleCiudadano, :dProFechaVisibleCiudadano, "
+ ":sProResponsableTecnico, :dProFechaAlta, :dProFechaModificacion, :sProUsuarioModificacion, :sProEstado)");
namedParameters.put("iProCodigoInterno", pProcedimiento.getProCodigoInterno());
namedParameters.put("iProCodigoSia", pProcedimiento.getProCodigoSia());
namedParameters.put("sProTipoTramite", pProcedimiento.getProTipoTramite());
namedParameters.put("sProInterno", pProcedimiento.getProInterno());
namedParameters.put("sProEsComun", pProcedimiento.getProEsComun());
namedParameters.put("sProDenominacion", pProcedimiento.getProDenominacion());
namedParameters.put("sProDescripcion", pProcedimiento.getProDescripcion());
namedParameters.put("sProObservaciones", pProcedimiento.getProObservaciones());
namedParameters.put("sProCodOrgResponsableN1", pProcedimiento.getProCodOrgResponsableN1());
namedParameters.put("sProCodOrgResponsableN2", pProcedimiento.getProCodOrgResponsableN2());
namedParameters.put("sProUnidadGestoraTramite", pProcedimiento.getProUnidadGestoraTramite());
namedParameters.put("iProCodOrganica", pProcedimiento.getProCodOrganica());
namedParameters.put("sProSujetoTasas", pProcedimiento.getProSujetoTasas());
namedParameters.put("iProPeriodicidad", pProcedimiento.getProPeriodicidad());
namedParameters.put("iProCodClaseTramite", pProcedimiento.getProCodClaseTramite());
namedParameters.put("sProClasificacionArchivo", pProcedimiento.getProClasificacionArchivo());
namedParameters.put("sProRequisitosIniciacion", pProcedimiento.getProRequisitosIniciacion());
namedParameters.put("sProPresencialNoAdaptable", pProcedimiento.getProPresencialNoAdaptable());
namedParameters.put("iProCodNivelAe", pProcedimiento.getProCodNivelAe());
namedParameters.put("sProCodRequisitosIdenPj", pProcedimiento.getProCodRequisitosIdenPj());
namedParameters.put("sProCodRequisitosIdenPf", pProcedimiento.getProCodRequisitosIdenPf());
namedParameters.put("sProIdIntegradoClave", pProcedimiento.getProIdIntegradoClave());
namedParameters.put("sProObsIntegracionClave", pProcedimiento.getProObsIntegracionClave());
namedParameters.put("sProEnlaceWeb", pProcedimiento.getProEnlaceWeb());
namedParameters.put("iProPortal", pProcedimiento.getProPortal());
namedParameters.put("sProFormaIniInteresado", pProcedimiento.getProFormaIniInteresado());
namedParameters.put("iProCodSilencioInteresado", pProcedimiento.getProCodSilencioInteresado());
namedParameters.put("sProFormaIniOficio", pProcedimiento.getProFormaIniOficio());
namedParameters.put("iProCodSilencioOficio", pProcedimiento.getProCodSilencioOficio());
namedParameters.put("iProNumeroPlazoResolucion", pProcedimiento.getProNumeroPlazoResolucion());
namedParameters.put("iProCodTipoPlazoResolucion", pProcedimiento.getProCodTipoPlazoResolucion());
namedParameters.put("sProFinVia", pProcedimiento.getProFinVia());
namedParameters.put("iProProcedimientoAutorizacion", pProcedimiento.getProProcedimientoAutorizacion());
namedParameters.put("sProResponsable", pProcedimiento.getProResponsable());
namedParameters.put("sProVisibleCiudadano", pProcedimiento.getProVisibleCiudadano());
namedParameters.put("dProFechaVisibleCiudadano", pProcedimiento.getProFechaVisibleCiudadano());
namedParameters.put("sProResponsableTecnico", pProcedimiento.getProResponsableTecnico());
namedParameters.put("dProFechaAlta", pProcedimiento.getProFechaAlta());
namedParameters.put("dProFechaModificacion", pProcedimiento.getProFechaModificacion());
namedParameters.put("sProUsuarioModificacion", pProcedimiento.getProUsuarioModificacion());
namedParameters.put("sProEstado", pProcedimiento.getProEstado());
// Mapear los parámetros de la query almacenados en el HashMap
final SqlParameterSource params = new MapSqlParameterSource(namedParameters);
// Ejecutar la query y lanzar excepción en caso de fallo
try {
namedParameterJdbcTemplate.update(query, params);
} catch (final DataAccessException exDA) {
LOGGER.error("Error al insertar procedimiento: " + exDA.getMessage());
throw new DataManipulationException("Error al insertar procedimiento: " + exDA.getMessage());
}
//Here I should do the conexion.commit()
conexion.rollback();
} catch (SQLException | DataManipulationException e) {
//Se hace el rollback de los cambios
conexion.rollback();
}
}
Why isn't the autocommit(false) working?
Thanks in advance!