Uso della trattenibilità
Per impostazione predefinita, i set di risultati creati in una transazione vengono mantenuti aperti non appena viene eseguito il commit della transazione nel database oppure il rollback della transazione. Può talvolta essere utile, tuttavia, chiudere il set di risultati dopo il commit della transazione. A questo scopo, il driver Microsoft JDBC per SQL Server supporta l'uso della trattenibilità dei set di risultati.
La trattenibilità può essere impostata usando il metodo setHoldability della classe SQLServerConnection. Quando si imposta la trattenibilità con il metodo setHoldability, è possibile usare le costanti ResultSet.HOLD_CURSORS_OVER_COMMIT
o ResultSet.CLOSE_CURSORS_AT_COMMIT
del set di risultati.
Il driver JDBC supporta inoltre l'impostazione della trattenibilità quando si crea uno degli oggetti Statement. Quando si creano gli oggetti Statement che presentano overload rispetto ai parametri di trattenibilità dei set di risultati, la trattenibilità di tali oggetti deve corrispondere a quella della connessione. In caso di mancata corrispondenza, viene generata un'eccezione. In SQL Server la trattenibilità è infatti supportata solo a livello di connessione.
La trattenibilità di un set di risultati corrisponde alla trattenibilità di un oggetto SQLServerConnection associato al set di risultati al momento della creazione del set solo per i cursori sul lato server. Non si applica ai cursori sul lato client. Per tutti i set di risultati con cursori sul lato client il valore della trattenibilità è sempre ResultSet.HOLD_CURSORS_OVER_COMMIT
.
Per i cursori sul lato server, se connessi a SQL Server 2005 o versioni successive, l'impostazione influisce solo sulla trattenibilità dei nuovi set di risultati ancora da creare in tale connessione. Non interessa pertanto eventuali set di risultati creati in precedenza e già aperti in tale connessione.
Nell'esempio seguente viene impostata la trattenibilità del set di risultati durante l'esecuzione di una transazione locale formata da due istruzioni diverse nel blocco try
. Le istruzioni vengono eseguite sulla tabella Production.ScrapReason del database di esempio AdventureWorks2022. Viene prima di tutto attivata la modalità di transazione manuale impostando l'autocommit su false
. Dopo aver disabilitato la modalità di autocommit, non verrà eseguito il commit di istruzioni SQL finché l'applicazione non chiama in modo esplicito il metodo commit. Il codice nel blocco catch esegue il rollback della transazione se viene generata un'eccezione.
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();
}
}
}