Utilisation de la fonctionnalité de mise en attente
Par défaut, un jeu de résultats créé dans une transaction est maintenu ouvert après la validation de la transaction dans la base de données ou lors de sa restauration. Cependant, il est parfois utile de fermer le jeu de résultats une fois que la transaction a été validée. Pour ce faire, le pilote Microsoft JDBC pour SQL Server prend en charge l’utilisation de la fonctionnalité de mise en attente du jeu de résultats.
La fonctionnalité de mise en attente du jeu de résultats peut être définie à l’aide de la méthode setHoldability de la classe SQLServerConnection. Lors de la définition de la fonctionnalité de mise en attente à l'aide de la méthode setHoldability, les constantes de la fonctionnalité de mise en attente du jeu de résultats ResultSet.HOLD_CURSORS_OVER_COMMIT
ou ResultSet.CLOSE_CURSORS_AT_COMMIT
peuvent être utilisées.
Le pilote JDBC prend également en charge la définition de la fonctionnalité de mise en attente lors de la création de l'un des objets Statement. Lors de la création d'objets Statement qui ont des surcharges avec des paramètres de fonctionnalité de mise en attente du jeu de résultats, la fonctionnalité de mise en attente de l'objet statement doit correspondre à la fonctionnalité de mise en attente de la connexion. En l'absence de correspondance, une exception est levée. En effet, SQL Server prend en charge la fonctionnalité de mise en attente uniquement au niveau de la connexion.
La fonctionnalité de mise en attente d’un jeu de résultats représente la fonctionnalité de mise en attente de l’objet SQLServerConnection qui est associé au jeu de résultats lors de la création de ce dernier pour les curseurs côté serveur uniquement. Cela ne s'applique pas aux curseurs côté client. Tous les jeux de résultats avec des curseurs côté client ont toujours la valeur de fonctionnalité de mise en attente ResultSet.HOLD_CURSORS_OVER_COMMIT
.
Pour les curseurs côté serveur, lors d'une connexion à SQL Server 2005 ou ultérieur, la définition de la fonctionnalité de mise en attente affecte uniquement la fonctionnalité des nouveaux jeux de résultats qui doivent être créés sur cette connexion. En d'autres termes, la définition de la fonctionnalité de mise en attente n'a aucun impact sur la fonctionnalité de mise en attente des jeux de résultats qui ont été créés antérieurement et qui sont déjà ouverts sur cette connexion.
Dans l’exemple suivant, la fonctionnalité de mise en attente du jeu de résultats est définie durant l’exécution d’une transaction locale composée de deux instructions séparées dans le bloc try
. Les instructions sont exécutées sur la table Production.ScrapReason dans l’exemple de base de données AdventureWorks2022. Tout d'abord, l'exemple passe en mode de transaction manuelle en définissant la validation automatique avec la valeur false
. Une fois le mode de validation automatique désactivé, aucune instruction SQL n’est validée tant que l’application n’appelle pas explicitement la méthode commit. Le code dans le bloc catch restaure la transaction si une exception est levée.
public static void executeTransaction(Connection con) {
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
con.setAutoCommit(false);
con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
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));
}
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}