Partilhar via


Usando a capacidade de retenção

Baixar driver JDBC

Por defeito, um conjunto de resultados criado dentro de uma transação é mantido aberto após a transação ser confirmada na base de dados, ou quando é revertida. No entanto, por vezes é útil que o conjunto de resultados seja fechado depois de a transação ter sido completada. Para isso, o Microsoft JDBC Driver for SQL Server suporta a utilização da capacidade de manutenção do conjunto de resultados.

A holdability do conjunto de resultados pode ser definida usando o método setHoldability da classe SQLServerConnection . Ao definir a holdability usando o método setHoldability, as constantes de holdability do conjunto de resultados de ResultSet.HOLD_CURSORS_OVER_COMMIT ou ResultSet.CLOSE_CURSORS_AT_COMMIT podem ser usadas.

O driver JDBC também suporta definir a sustentabilidade ao criar um dos objetos Statement. Ao criar os objetos Statement que têm sobrecargas com parâmetros de holdability do conjunto de resultados, a holdability do objeto Statement deve corresponder à holdability da ligação. Quando não coincidem, é lançada uma exceção. Isto porque o SQL Server suporta a manutenção apenas ao nível da ligação.

A persistência de um conjunto de resultados é a persistência do objeto SQLServerConnection associado a este conjunto quando ele é criado, apenas para cursores no lado do servidor. Não se aplica a cursores do lado do cliente. Todos os conjuntos de resultados com cursores no lado do cliente terão sempre o valor de persistência de ResultSet.HOLD_CURSORS_OVER_COMMIT.

Para cursores de servidor, quando conectados ao SQL Server 2005 ou posterior, definir a persistência afeta apenas a persistência de novos conjuntos de resultados que ainda estão para ser criados nessa ligação. Significa que definir a retenção não tem impacto na retenção de quaisquer conjuntos de resultados que foram criados anteriormente e já estejam abertos nessa ligação.

No exemplo seguinte, a holdabilidade do conjunto de resultados é definida ao realizar uma transação local composta por duas instruções separadas no bloco try. As instruções são executadas contra a tabela Production.ScrapReason na base de dados de exemplo AdventureWorks2025. Primeiro, o exemplo muda para o modo de transação manual ao definir o auto-commit para false. Uma vez desativado o modo de auto-commit, nenhuma Declaração SQL será comprometida até que a aplicação chame explicitamente o método commit . O código no bloco de captura reverte a transação se for lançada uma exceção.

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();
        }
    }
}

Consulte também

Realização de transações com o driver JDBC