Transactions et gestionnaires de contexte
Valider et annuler les transactions en toute sécurité
Transactions et gestionnaires de contexte est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce qu'une transaction ?
Une transaction regroupe plusieurs instructions afin qu'elles réussissent ou échouent toutes ensemble. Cela préserve la cohérence de vos données.
SQLite démarre automatiquement une transaction avant les instructions qui modifient les données.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
print('Table ready for transactions')
conn.close()Valider pour enregistrer
Les modifications ne sont pas permanentes tant que vous n'avez pas appelé conn.commit(). Jusque-là, elles existent uniquement dans la transaction actuelle.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.commit()
print('Committed')
conn.close()Annuler les modifications
conn.rollback() annule toutes les modifications effectuées depuis la dernière validation. Utilisez-le lorsqu'un problème survient.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
conn.commit()
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.rollback()
cur.execute('SELECT COUNT(*) FROM accounts')
print('Rows after rollback:', cur.fetchone()[0])
conn.close()Un transfert d'argent
Les transactions sont particulièrement utiles lorsque plusieurs mises à jour doivent rester synchronisées. Un virement bancaire soustrait une somme d'un compte et l'ajoute à un autre. Les deux opérations doivent avoir lieu, ou aucune des deux.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (2, 50)')
cur.execute('UPDATE accounts SET balance = balance - 30 WHERE id = 1')
cur.execute('UPDATE accounts SET balance = balance + 30 WHERE id = 2')
conn.commit()
cur.execute('SELECT id, balance FROM accounts')
print(cur.fetchall())
conn.close()Gérer les erreurs avec try/except
Entourez une transaction d'un bloc try/except. En cas d'erreur, annulez les modifications afin que des changements partiels ne corrompent pas vos données.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
try:
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 200)')
conn.commit()
except sqlite3.IntegrityError:
conn.rollback()
print('Rolled back after error')
conn.close()Connexion en tant que gestionnaire de contexte
Utiliser with conn: valide automatiquement la transaction en cas de succès et l'annule si une exception se produit dans le bloc.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
with conn:
conn.execute('INSERT INTO accounts (balance) VALUES (100)')
print('Auto-committed via with block')
conn.close()Annulation automatique en cas d'exception
Si le bloc with conn: déclenche une exception, la transaction est automatiquement annulée. Notez que la connexion elle-même reste ouverte.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY)')
try:
with conn:
conn.execute('INSERT INTO accounts (id) VALUES (1)')
conn.execute('INSERT INTO accounts (id) VALUES (1)')
except sqlite3.IntegrityError:
print('Block rolled back automatically')
count = conn.execute('SELECT COUNT(*) FROM accounts').fetchone()[0]
print('Rows:', count)
conn.close()closing() pour la connexion
L'outil contextlib.closing garantit que close() est appelé à la fin du bloc, ce qui libère la connexion.
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER)')
print('Used inside closing()')
print('Connection closed automatically')Combiner les deux approches
Imbriquez with conn: dans closing(...) pour gérer à la fois la transaction et la fermeture de la connexion.
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER, v TEXT)')
with conn:
conn.execute('INSERT INTO t VALUES (1, ?)', ('hello',))
print(conn.execute('SELECT * FROM t').fetchall())isolation_level
isolation_level de la connexion contrôle le moment où les transactions commencent. La valeur par défaut laisse SQLite les gérer ; la définir sur None active le mode de validation automatique.
import sqlite3
conn = sqlite3.connect(':memory:')
print('Default isolation_level:', repr(conn.isolation_level))
conn.isolation_level = None
print('Now autocommit:', conn.isolation_level)
conn.close()Pourquoi les transactions sont importantes
Sans transactions, une panne au milieu d'une mise à jour pourrait laisser des données à moitié modifiées. Les transactions rendent un ensemble de modifications atomique : indivisible. Cela protège l'intégrité des données.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE log (msg TEXT)')
with conn:
conn.execute('INSERT INTO log VALUES (?)', ('all or nothing',))
print('Atomic write done')
conn.close()Vérification rapide
Vérifiez vos connaissances sur les transactions.
Récapitulatif
Vous avez appris à gérer les transactions en toute sécurité.
commit()enregistre les modifications ;rollback()les annule- Entourez les écritures risquées d'un bloc
try/exceptavec annulation with conn:valide ou annule automatiquement la transactioncontextlib.closinggarantit la fermeture de la connexion
Questions Fréquemment Posées
La leçon « Transactions et gestionnaires de contexte » est-elle gratuite ?
Oui — le texte complet de « Transactions et gestionnaires de contexte » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Transactions et gestionnaires de contexte » ?
Valider et annuler les transactions en toute sécurité Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Transactions et gestionnaires de contexte » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Connexion et création de tables
- Insert, Select, Update, Delete
- Requêtes paramétrées
- Transactions et gestionnaires de contexte