Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
De forma predeterminada, un conjunto de resultados creado dentro de una transacción se cierra cuando la transacción se ha confirmado a la base de datos o se ha revertido. No obstante, en ocasiones es útil que el conjunto de resultados permanezca abierto, incluso después de haber confirmado la transacción. Para ello, el controlador JDBC de SQL Server 2005 de Microsoft es compatible con el uso de la capacidad de alojamiento de los 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 los conjuntos de resultados, OLD_CURSORS_OVER_COMMIT o CLOSE_CURSORS_AT_COMMIT.
Nota
El controlador JDBC no es compatible con la configuración de la capacidad de alojamiento cuando se crea uno de los objetos Statement. Los objetos de instrucción que tengan sobrecargas con los parámetros de la capacidad de alojamiento de los conjuntos de resultados, lanzarán una excepción cuando se las llame.
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ó sólo para los cursores del lado del servidor. Esto no se aplica a los cursores del lado del cliente.
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 separadas en el bloque try. Las instrucciones se ejecutan en la tabla Production.ScrapReason en la base de datos de ejemplo AdventureWorks de SQL Server 2005 y se usa un punto de retorno para revertir la segunda instrucción. Como resultado, sólo se confirma en la base de datos la primera instrucció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 {
con.rollback();
System.out.println("Transaction failed.");
}
catch (SQLException se) {
se.printStackTrace();
}
}