| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Fonctionnalités avancées | Next >>> |
Les Transactions sont un concept fondamental de tous les systemes de bases de données. Le point essentiel d'une transaction est qu'elle réalise plusieurs étapes dans une même opération. Les états intermédiaires entre le étapes ne sont pas visible aux autres transactions concurrentes, et si certaines erreurs se produisent qui empêchent la transaction de se réaliser, elle n'affectera pas l'ensemble de la base.
Par exemple, considérons une base bancaire qui contient des mouvements entre différents comptes, aussi bien que le total des mouvements de dépôts des succursales. Supposons que nous voulons enregistrer un paiement de 100.00 $ depuis un compte Alice vers un compte Bob. En simplifiant outrageusement, la commande SQL devrait ressembler à :
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob'); |
Nous voulons aussi la garantie qu'une transaction est complète et reconnue par le système, qu'elle a été enregistrée de façon permanente et qu'elle ne sera pas perdue même si crash survient par la suite. Par exemple, nous avons enregistré un retrait en expèces par Bob, nous ne voulons en aucune manière que le débit de son compte disparaisse dans un crash juste après qu'il ait passé la porte de la banque. Une base transactionnelle garantit que toutes les mises à jour faites par une transaction sont stockées de façon permanente (c'est à dire, sur disque) avant que la transaction s'affiche complète.
Une autre propiété importante des bases transactionnelles est la notion de mises à jour atomiques : quand de multiples transactions s'opèrent simultanément, aucune ne doit être capable de voir les changements incomplets faits par les autres. Par exemple, si une transaction est en train de traiter la totalité des mouvements de tous les comptes, elle ne devra pas inclure le débit du compte Alice mais pas le crédit du compte Bob, et vice et versa. Ainsi les transactions doivent fonctionner sur le système du "tout ou rien", pas seulement en termes d'effets permanents sur la base, mais en termes de visibilité. Les mises à jour faites par une transaction sont invisibles aux autres transactions jusqu'à ce qu'elles soient complètes, à ce moment là toutes les mises à jour deviennent visibles simultanément.
Dans PostgreSQL, une transaction est établie par les commandes BEGIN et COMMIT. Notre transaction bancaire devrait ressembler à ça :
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT; |
PostgreSQL traite actuellement chaque commande SQL comme si elle était exécutée dans une transaction. Si vous ne placez pas la commande BEGIN alors chaque commande individuelle aura un BEGIN implicite et (si absence d'erreurs) un COMMIT. Un groupe de commandes encadrées par BEGIN et COMMIT est quelque fois appelé block de transaction.
![]() | Certaines librairies client éditent les commandes BEGIN et COMMIT automatiquement, ainsi vous obtenez l'effet d'un block de transaction sans l'avoir demandé. Vérifiez la documention de l'interface que vous utilisez. |
| <<< Previous | Home | Next >>> |
| Clés étrangères | Up | Héritage |