Utilisation de points de sauvegarde

Télécharger le pilote JDBC

Les points d'enregistrement constituent un mécanisme permettant d'annuler certaines parties de transactions. Dans SQL Server, vous pouvez créer un point de sauvegarde à l’aide de l’instruction SAVE TRANSACTION savepoint_name. Par la suite, vous pourrez exécuter une instruction ROLLBACK TRANSACTION nom_point_enregistrement pour revenir au point d'enregistrement au lieu de revenir au début de la transaction.

Les points d'enregistrement sont utiles dans les situations où des erreurs sont susceptibles de se produire. L'utilisation d'un point d'enregistrement pour annuler une partie d'une transaction en cas d'erreur non fréquente peut s'avérer plus efficace que de tester chaque transaction afin de voir si une mise à jour est valide avant de l'implémenter. Les mises à jour et les restaurations étant des opérations coûteuses, les points d'enregistrement ne sont efficaces que si la probabilité de rencontrer l'erreur est faible et si le coût de vérification préalable de la validité d'une mise à jour est relativement élevé.

Le pilote JDBC Microsoft pour SQL Server prend en charge l'utilisation de points d'enregistrement à l'aide de la méthode setSavepoint de la classe SQLServerConnection. La méthode setSavepoint permet de créer un point de sauvegarde nommé ou non à l’intérieur de la transaction en cours et retourne un objet SQLServerSavepoint. Il est possible de créer plusieurs points d'enregistrement à l'intérieur d'une transaction. Pour annuler une transaction jusqu’à un point de sauvegarde donné, vous pouvez transmettre l’objet SQLServerSavepoint à la méthode rollback (java.sql.Savepoint).

Dans l’exemple suivant, un point de sauvegarde est utilisé lors de l’exécution d’une transaction locale composée de deux instructions distinctes dans le bloc try. Les instructions sont exécutées sur la table Production.ScrapReason de l’exemple de base de données AdventureWorks2022, et un point de sauvegarde est utilisé pour restaurer la deuxième instruction. Cela a pour effet que seule la première instruction est validée dans la base de données.

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

Voir aussi

Réalisation de transactions avec le pilote JDBC