Verwenden der Haltbarkeit
Standardmäßig bleibt ein Resultset, das in einer Transaktion erstellt wurde, nach einem Commit der Transaktion in der Datenbank oder einem Rollback geöffnet. Bisweilen ist es aber von Nutzen, das Resultset nach einem Commit der Transaktion zu schließen. Zu diesem Zweck unterstützt der Microsoft JDBC-Treiber für SQL Server die Verwendung der Resultsethaltbarkeit.
Sie können die Resultsethaltbarkeit mit der setHoldability-Methode der SQLServerConnection-Klasse einstellen. Beim Einstellen der Haltbarkeit mit der setHoldability-Methode können für die Resultsethaltbarkeit die Konstanten ResultSet.HOLD_CURSORS_OVER_COMMIT
oder ResultSet.CLOSE_CURSORS_AT_COMMIT
verwendet werden.
Der JDBC-Treiber unterstützt auch das Festlegen der Haltbarkeit beim Erstellen eines der Statement-Objekte. Beim Erstellen der Statement-Objekte, die mit Parametern für die Resultsethaltbarkeit überladen sind, muss die Haltbarkeit des Statement-Objekts der Haltbarkeit der Verbindung entsprechen. Stimmen sie nicht überein, wird eine Ausnahme ausgelöst. Der Grund hierfür ist, dass SQL Server die Haltbarkeit nur auf Verbindungsebene unterstützt.
Bei der Haltbarkeit eines Resultsets handelt es sich um die Haltbarkeit eines SQLServerConnection-Objekts, das nur beim Erstellen von serverseitigen Cursorn dem Resultset zugeordnet wird. Dies gilt nicht für clientseitige Cursor. Alle Resultsets mit clientseitigen Cursorn besitzen immer den Haltbarkeitswert ResultSet.HOLD_CURSORS_OVER_COMMIT
.
Wenn Servercursor mit SQL Server 2005 oder höher verbunden sind, wirkt sich das Festlegen der Haltbarkeit nur auf die Haltbarkeit neuer Resultsets aus, die erst noch für diese Verbindung erstellt werden. Das heißt, das Festlegen der Haltbarkeit hat keine Auswirkungen auf die Haltbarkeit von Resultsets, die zuvor erstellt wurden und für die Verbindung bereits geöffnet sind.
Im folgenden Beispiel wird die Resultsethaltbarkeit beim Ausführen einer lokalen Transaktion mit zwei getrennten Anweisungen im try
-Block festgelegt. Die Anweisungen werden für die Tabelle „Production.ScrapReason“ in der AdventureWorks2022-Beispieldatenbank ausgeführt. Zunächst wird im Beispiel zum manuellen Transaktionsmodus gewechselt, indem die der automatische Commit auf false
festgelegt wird. Sobald der automatische Commitmodus deaktiviert ist, wird ein Commit von SQL-Anweisungen erst ausgeführt, wenn die Anwendung die commit-Methode explizit aufruft. Der Code im catch-Block führt ein Rollback der Transaktion aus, wenn eine Ausnahme ausgelöst wird.
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();
}
}
}