Quand on développe un programme P accédant à une base de données, on suppose que :
Or les bases de données constituent des ressources accessibles simultanément à plusieurs utilisateurs pour rechercher, créer, modifier ou détruire des informations :
les accès simultanés à une même ressource sont dits concurrents => contrôle de concurrence
Il existe une multitude de raison qu’un programme ne se déroule pas intégralement (arrêt des serveurs, erreurs de code, violation de contrainte …) => reprise sur panne
http://sql.bdpedia.fr/transactions.html
DELETE UPDATE INSERT : ce sont des instructions transactionnelles atomiques (elles fonctionnent complètement ou pas du tout)
Le concept de transaction sur un compte (bancaire …)
UPDATE sb_accounts SET balance = balance - 1000 WHERE account_no = 111111 ;
UPDATE ca_accounts SET balance = balance + 1000 WHERE account_no = 222222 ;
INSERT INTO journal VALUES (100896, 'Transfert de M Dupond ', '2017-01-01', 111111, 222222, 1000);
COMMIT WORK;
documentation : “doc developpez.com” “doc postgreSQL”
DROP TABLE IF EXISTS td_Client;
CREATE TABLE td_Client (
id_client INTEGER NOT NULL,
nom varchar(30) NOT NULL,
nb_places_reservees INTEGER NOT NULL,
solde INTEGER NOT NULL,
PRIMARY KEY (id_client)
);
INSERT into td_Client VALUES (1, 'Philippe', 0, 2000);
INSERT into td_Client VALUES (2, 'Julie', 0, 350);
INSERT into td_Client VALUES (3, 'alex', 0, 350);
SELECT @@autocommit;
UPDATE td_Client SET nom="ALEXANDRE" WHERE id_client=3;
SET autocommit=0; -- Les "COMMIT" ne sont plus automatiques
SELECT * FROM td_Client WHERE id_client=3;
START TRANSACTION;
UPDATE td_Client SET nom="alex1" WHERE id_client=3;
SELECT * FROM td_Client WHERE id_client=3;
ROLLBACK;
SELECT * FROM td_Client WHERE id_client=3;
UPDATE td_Client SET nom="alex2" WHERE id_client=3;
SELECT * FROM td_Client WHERE id_client=3;
-- se connecter depuis un autre terminal sur cette base de données (nouvelle session) ; qu'elle est la valeur du champ nom ?
COMMIT;
SELECT * FROM td_Client WHERE id_client=3;
ROLLBACK;
SELECT * FROM td_Client WHERE id_client=3;