De forma predeterminada, un conjunto de resultados creado dentro de una transacción se mantiene abierto cuando se ha confirmado la transacción a la base de datos o se ha revertido. No obstante, en ocasiones es útil que el conjunto de resultados esté cerrado, incluso después de haber confirmado la transacción. Para ello, el Controlador Microsoft JDBC para SQL Server admite el uso de la capacidad de alojamiento de conjuntos de resultados.

La capacidad de alojamiento de los conjuntos de resultados se puede configurar con el método setHoldability de la clase SQLServerConnection. A la hora de configurar la capacidad de alojamiento con el método setHoldability, se pueden usar las constantes de la capacidad de alojamiento del conjunto de resultados de ResultSet.HOLD_CURSORS_OVER_COMMIT o ResultSet.CLOSE_CURSORS_AT_COMMIT.

El controlador JDBC también es compatible con la configuración de la capacidad de alojamiento cuando se crea uno de los objetos Statement. Al crear los objetos Statement que tengan sobrecargas con los parámetros de la capacidad de alojamiento de los conjuntos de resultados, la capacidad de alojamiento del objeto de instrucción debe coincidir con la capacidad de alojamiento de la sobrecarga. Cuando no coinciden, se genera una excepción. Esto se debe a que SQL Server solamente admite la capacidad de alojamiento en el nivel local.

La capacidad de alojamiento de un conjunto de resultados es la capacidad de alojamiento del objeto SQLServerConnection asociado con el conjunto de resultados en el momento en el que se creó solamente para los cursores del lado del servidor. Esto no se aplica a los cursores del lado cliente. Todos los conjuntos de resultados del lado cliente tendrán siempre el valor de capacidad de alojamiento de ResultSet.HOLD_CURSORS_OVER_COMMIT.

Para los cursores de servidor, cuando están conectados a SQL Server 2005 o versiones posteriores, la configuración de la capacidad de alojamiento solamente afecta a la de los nuevos conjuntos de resultados que todavía han de ser creados en esa conexión. Eso significa que la configuración de la capacidad de alojamiento no tiene impacto alguno sobre la capacidad de alojamiento de los conjuntos de resultados creados previamente que ya estaban abiertos en esa conexión. Con SQL Server 2000, sin embargo, configurar la capacidad de alojamiento afecta a la capacidad de alojamiento de los resultados existentes como a la de los nuevos conjuntos de resultados que todavía han de ser creados en esa conexión.

En el siguiente ejemplo, se configura la capacidad de alojamiento del conjunto de resultados mientras se realiza una transición local, consistente en dos instrucciones independientes en el bloque try. Las instrucciones que se ejecutan contra la tabla Production.ScrapReason de la base de datos de ejemplo AdventureWorks de SQL Server 2005. Primero, el ejemplo cambia al modo de transacción manual configurando la confirmación automática en false. Cuando el modo de confirmación automática esté deshabilitado, no se confirmarán instrucciones SQL hasta que la aplicación llame explícitamente al método commit. El código del bloque catch revierte la transacción si se genera una excepción.

public static void executeTransaction(Connection con) {
   try {
       con.setAutoCommit(false);
       con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
       Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
       stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Bad part')");
       ResultSet rs = stmt.executeQuery("SELECT * FROM Production.ScrapReason");
       con.commit();
       System.out.println("Transaction succeeded.");

       //Display results.
       while (rs.next()) {
          System.out.println(rs.getString(2));
       }
       stmt.close();
      }
      catch (SQLException ex) {
         ex.printStackTrace();
         try {
            System.out.println("Transaction failed.");
            con.rollback();
         }
         catch (SQLException se) {
            se.printStackTrace();
         }
      }
   }
}

Vea también