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

les bases

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;