setAutoCommit(false)不起作用

时间:2017-01-03 08:52:40

标签: java spring spring-jdbc jdbctemplate spring-transactions

我试图在某些方法中无法自动提交以使它们成为事务性的。我使用spring JDBC Template。

我尝试使用de @Transactional注释,但另一个依赖于此的Web应用程序停止正常工作,所以我尝试了不同的东西。我试图从模板获取连接,并手动将自动提交设置为false。

问题是,我认为它根本不是残疾人。我有一个insert方法,并在最后,为了测试,我做一个回滚而不是提交。

在JUnit测试中,我尝试恢复具有不存在的Id的对象,它不返回任何内容。然后我用该Id创建一个对象,并尝试插入它。它应该不返回任何内容,因为insert方法执行回滚,但它返回我插入的对象。

这是一些代码。

数据源bean:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="${jdbc.jndiName}" />
    <property name="resourceRef" value="true" />
</bean>

执行插入的DAO中的数据源声明:

  @Autowired
  public final void setDataSource(final DataSource pDataSource) {
    this.jdbcTemplate = new JdbcTemplate(pDataSource);
  }

插入方法:

    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();
        }
      }

为什么autocommit(false)不工作?

提前致谢!

0 个答案:

没有答案