Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Standardmäßig bleibt eine Ergebnismenge, die innerhalb einer Transaktion erstellt wurde, geöffnet, nachdem die Transaktion in der Datenbank festgeschrieben oder zurückgesetzt wurde. 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.
Die Haltbarkeit von Resultsets kann mithilfe der setHoldability-Methode der SQLServerConnection-Klasse festgelegt werden. 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.
Bei Servercursorn gilt bei einer Verbindung mit SQL Server 2005 oder höher: Das Festlegen der Haltbarkeit wirkt sich nur auf die Haltbarkeit neuer Ergebnismengen aus, die auf dieser Verbindung erst noch 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 AdventureWorks2025-Beispieldatenbank ausgeführt. Zunächst wird im Beispiel zum manuellen Transaktionsmodus gewechselt, indem die der automatische Commit auf false festgelegt wird. Sobald der Auto-Commit-Modus deaktiviert ist, werden keine SQL-Anweisungen festgeschrieben, bis die Anwendung die Methode commit explizit aufruft. Der Code im catch-Block setzt die Transaktion zurück, 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();
}
}
}