Como usar a suspensão

Baixar o JDBC Driver

Por padrão, um conjunto de resultados criado dentro de uma transação é mantido em aberto depois que a transação é confirmada no banco de dados, ou quando é revertida. Porém, às vezes é útil que o conjunto de resultados seja fechado, depois que a transação foi confirmada. Para fazer isso, o Microsoft JDBC Driver para SQL Server dá suporte ao uso de suspensão de conjuntos de resultados.

A colocação em espera de conjuntos de resultados pode ser configurada usando o método setHoldability da classe SQLServerConnection. Ao definir a colocação em espera usando o método setHoldability, podem ser usadas as constantes de colocação em espera do conjunto de resultados de ResultSet.HOLD_CURSORS_OVER_COMMIT ou ResultSet.CLOSE_CURSORS_AT_COMMIT.

O driver JDBC também oferece suporte à colocação em espera ao criar um dos objetos de instrução. Ao criar os objetos de Instrução que têm sobrecargas com parâmetros de colocação em espera do conjunto de resultados, o objeto de instrução de colocação em espera deverá corresponder à colocação em espera da conexão. Quando eles não corresponderem, uma exceção será lançada. Isto acontece porque o SQL Server só oferece suporte à colocação em espera no nível de conexão.

A colocação em espera de um conjunto de resultados é a colocação em espera do objeto SQLServerConnection que está associado ao conjunto de resultados apenas no momento em que ele é criado para cursores do lado de servidor. Isso não se aplica a cursores do lado do cliente. Todos os conjuntos de resultados com cursores do lado do cliente sempre terão o valor de suspensão de ResultSet.HOLD_CURSORS_OVER_COMMIT.

Nos cursores de servidor, quando conectados ao SQL Server 2005 ou posterior, a definição da suspensão afetará apenas a suspensão dos novos conjuntos de resultados que ainda serão criados nessa conexão. Isto significa que configurar a colocação em espera não tem nenhum impacto na colocação em espera de nenhum conjunto de resultados que foi criado e que já está aberto previamente naquela conexão.

No exemplo a seguir, a colocação em espera de um conjunto de resultados é definida durante a execução de uma transação local que consiste em duas instruções separadas no bloco try. As instruções são executadas em relação à tabela Production.ScrapReason no banco de dados de exemplo AdventureWorks2022. Primeiro, o exemplo alterna para o modo de transação manual definindo a confirmação automática como false. Quando o modo de confirmação automática é desabilitado, nenhuma instrução SQL será confirmada até que o aplicativo chame o método commit explicitamente. O código no bloco catch reverterá a transação se uma exceção for lançada.

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

Confira também

Executando transações com o JDBC Driver