Définition
L’atomicité garantit que chaque transaction est traitée comme une seule “unité”, qui réussit complètement ou échoue complètement
En SQL
BEGIN TRANSACTION;
-- Étape 1 : Débiter le compte source
UPDATE account
SET balance = balance - 100
WHERE id = 1;
-- Étape 2 : Créditer le compte destinataire
UPDATE account
SET balance = balance + 100
WHERE id = 2;
-- COMMIT Si tout s’est bien passé OU ROLLBACK on annule tout
COMMIT ou ROLLBACK;En Java
Par défaut, avec JDBC, chaque instruction est faite dans une transaction indépendante (autocommit=true)
Connection conn = DriverManager.getConnection(url, user, password);
try {
// Transaction 1
PreparedStatement debit = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE id = 1");
debit.executeUpdate(); // COMMIT immédiat
// Transaction 2
PreparedStatement credit = conn.prepareStatement("UPDATE account SET balance = balance + 100 WHERE id = 2");
credit.executeUpdate(); // COMMIT immédiat, si échec alors transaction 1 non rollback
} catch (Exception e) {
// rollback inutile ici
conn.rollback();
}Gérer manuellement les transactions
Le mode de validation automatique par défaut doit être désactivé et la transaction devra être gérée manuellement. La transaction est validée si toutes les instructions s’exécutent avec succès, sinon une annulation est déclenchée en cas d’échec
On déclare connection.setAutoCommit(false);, ce qui nous oblige à gérer manuellement la transaction
connection.commit();si tout se déroule correctementconnection.rollback();qui annulera l’ensemble des transferts
Connection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); // 🔴 on dit qu'on gèrera nous même le .commit() et le .rollback()
try {
// Pas de transaction
PreparedStatement debit = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE id = 1");
debit.executeUpdate(); // pas de commit immédiat
// Pas de transaction
PreparedStatement credit = conn.prepareStatement("UPDATE account SET balance = balance + 100 WHERE id = 2");
credit.executeUpdate(); // pas de commit immédiat
conn.commit(); // commit atomique => 1 unique transaction
} catch (Exception e) {
conn.rollback(); // rollback complet
}