Partilhar via


Usando pontos de salvamento

Baixar driver JDBC

Os pontos de salvaguarda oferecem um mecanismo para reverter partes das transações. No SQL Server, pode criar um ponto de gravação usando a instrução SAVE TRANSACTION savepoint_name. Mais tarde, executa a instrução ROLLBACK TRANSACTION savepoint_name para voltar ao ponto de salvaguarda em vez de voltar ao início da transação.

Os pontos de restauro são úteis em situações onde é improvável que ocorram erros. A utilização de um ponto de gravação para reverter parte de uma transação no caso de um erro pouco frequente pode ser mais eficiente do que fazer cada transação testar se uma atualização é válida antes de a fazer. Atualizações e rollbacks são operações dispendiosas, por isso os pontos de salvaguarda só são eficazes se a probabilidade de encontrar o erro for baixa e o custo de verificar previamente a validade de uma atualização for relativamente elevado.

O Microsoft JDBC Driver para SQL Server suporta a utilização de pontos de gravação através do método setSavepoint da classe SQLServerConnection . Ao usar o método setSavepoint, pode criar um ponto de gravação nomeado ou não nomeado dentro da transação atual, e o método devolverá um objeto SQLServerSavepoint . Podem ser criados múltiplos pontos de gravação no âmbito de uma transação. Para reverter uma transação para um dado savepoint, pode passar o objeto SQLServerSavepoint para o método rollback (java.sql.Savepoint).

No exemplo seguinte, utiliza-se um ponto de gravação 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, e um savepoint (ponto de gravação) é usado para reverter a segunda instrução. Isto resulta em apenas a primeira instrução ser confirmada na base 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();
        }
    }
}

Consulte também

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