setAutoCommit(false) doesn't work

1.2k Views Asked by At

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!

0

There are 0 best solutions below