Como usar pontos de salvamento

Baixar Driver JDBC

Os pontos de salvamento oferecem um mecanismo para reverter partes de transações. No SQL Server, é possível criar um ponto de salvamento usando a instrução SAVE TRANSACTION nome_do_ponto_de_salvamento. Posteriormente, você executa uma instrução ROLLBACK TRANSACTION nome_do_ponto_de_salvamento para reverter ao ponto de salvamento em vez de reverter ao início da transação.

Os pontos de salvamento são úteis em situações onde erros são improváveis. O uso de um ponto de salvamento para reverter parte de uma transação na ocorrência de um erro não frequente pode ser mais eficiente do que testar cada transação para verificar se uma atualização é válida antes de fazer a atualização. As atualizações e reversões são operações caras, portanto, pontos de salvamento só serão eficientes se a probabilidade de encontrar o erro for baixa e o custo de verificar a validade de uma atualização com antecedência for relativamente alto.

O Microsoft JDBC Driver para SQL Server dá suporte ao uso de pontos de salvamento por meio do método setSavepoint da classe SQLServerConnection. Usando o método setSavepoint, você pode criar um ponto de salvamento nomeado ou sem nome na transação atual, e o método retornará um objeto SQLServerSavepoint. Podem ser criados vários pontos de salvamento em uma transação. Para reverter uma transação a um determinado ponto de salvamento, você pode passar o objeto SQLServerSavepoint para o método rollback (java.sql.Savepoint).

No exemplo a seguir, um ponto de salvamento é usado 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 na tabela Production.ScrapReason do banco de dados de exemplo AdventureWorks2022 e um ponto de salvamento é usado para reverter a segunda instrução. Isso faz com que apenas a primeira instrução seja confirmada no banco de dados.

public static void executeTransaction(Connection con) {
    try(Statement stmt = con.createStatement();) {
        con.setAutoCommit(false);
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
        Savepoint save = con.setSavepoint();
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
        con.rollback(save);
        con.commit();
        System.out.println("Transaction succeeded.");
    }
    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