Présentation des transactions
Les transactions sont des groupes d'opérations combinés en unités logiques de travail. Elles sont utilisées pour contrôler et maintenir la cohérence et l'intégrité de chaque action dans une transaction, malgré les erreurs pouvant se produire dans le système.
Avec le pilote JDBC Microsoft pour SQL Server, les transactions peuvent être locales ou distribuées. Les transactions peuvent également utiliser des niveaux d'isolation. Pour plus d'informations sur les niveaux d'isolation pris en charge par le pilote JDBC, consultez Présentation des niveaux d’isolation.
Les applications doivent contrôler les transactions en utilisant des instructions Transact-SQL ou les méthodes fournies par le pilote JDBC, mais pas les deux. L'utilisation des instructions Transact-SQL et des méthodes de l'API JDBC sur la même transaction peut entraîner des problèmes, par exemple une transaction qui ne peut pas être validée comme prévu, une transaction qui est validée ou restaurée, et une nouvelle qui démarre de façon inattendue, ou des exceptions de type « Le serveur n'a pas pu reprendre la transaction ».
Utilisation de transactions locales
Une transaction est considérée comme locale lorsqu'il s'agit d'une transaction à phase unique traitée directement par la base de données. Le pilote JDBC prend en charge les transactions locales à l'aide de diverses méthodes de la classe SQLServerConnection, y compris setAutoCommit, commit et rollback. Les transactions locales sont généralement gérées explicitement par l'application ou automatiquement par le serveur d'applications Java EE (Java Platform, Enterprise Edition).
L'exemple suivant effectue une transaction locale comprenant deux instructions distinctes dans le bloc try
. Les instructions sont exécutées sur la table Production.ScrapReason dans l’exemple de base de données AdventureWorks2022 et sont validées si aucune exception n’est levée. Le code dans le bloc catch
annule la transaction en cas d'exception.
public static void executeTransaction(Connection con) {
try {
//Switch to manual transaction mode by setting
//autocommit to false. Note that this starts the first
//manual transaction.
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')");
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')");
con.commit(); //This commits the transaction and starts a new one.
stmt.close(); //This turns off the transaction.
System.out.println("Transaction succeeded. Both records were written to the database.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}
Utilisation de transactions distribuées
Une transaction distribuée met à jour les données sur au moins deux bases de données en réseau, tout en conservant les propriétés ACID (Atomicité, Cohérence, Isolation et Durabilité) importantes du traitement de transactions. La prise en charge de transactions distribuées a été ajoutée à l'API de JDBC dans la spécification de l'API facultative de JDBC 2.0. Les transactions distribuées sont généralement gérées automatiquement par le gestionnaire de transactions JTS (Java Transaction Service) dans l'environnement d'un serveur d'applications Java EE. Cependant, le pilote JDBC Microsoft pour SQL Server prend en charge les transactions distribuées dans tout gestionnaire de transactions compatible avec l'API de transaction Java (JTA).
Le pilote JDBC est intégré de manière transparente à MS DTC (Microsoft Distributed Transaction Coordinator) pour offrir une véritable prise en charge des transactions distribuées avec SQL Server. MS DTC est une fonctionnalité de transactions distribuées fournie par Microsoft pour les systèmes d'exploitation Microsoft Windows. MS DTC utilise l'excellente technologie Microsoft de traitement des transactions pour prendre en charge les caractéristiques XA, telles que le protocole de validation distribué complet à deux phases et la récupération des transactions distribuées.
Pour plus d'informations sur l'utilisation des transactions distribuées, consultez Présentation des transactions XA.