Mini-TP : Simulation d'accès concurrents sous PostgreSQL
Se connecter deux fois à une même base de données dans deux terminaux (term1 et term2) :
psql mydb
psql mydb
Créer une table
test
:CREATE TABLE test (a integer);
Question
term1 Insérer une valeur :
INSERT ...
(COMMIT
implicite)term2 Vérifier que la valeur est visible :
SELECT ...
Solution
-- term1
INSERT INTO test(a) VALUES (1);
-- term2
SELECT * FROM test;
a
---
1
Question
term1 Commencer une transaction :
BEGIN TRANSACTION;
term1 Insérer la valeur 2 dans la table :
INSERT INTO...
term1 Vérifier que la valeur est bien dans la table :
SELECT * FROM ...
term2 Vérifier que la valeur n'est pas visible :
SELECT * FROM ...
term1 Valider la transaction :
COMMIT;
term2 Vérifier que la valeur est visible :
SELECT * FROM ...
Solution
-- term1
BEGIN TRANSACTION;
INSERT INTO test(a) VALUES (2);
SELECT * FROM test;
a
---
1
2
-- term2
SELECT * FROM test;
a
---
1
-- term1
COMMIT;
-- term2
SELECT * FROM test;
a
---
1
2
Question
term1 Commencer une transaction :
BEGIN TRANSACTION;
term1 Exécuter une mise à jour (multiplier toutes les valeurs par 2) :
UPDATE...
term2 Exécuter une mise à jour concurrente (multiplier les valeurs par 3) :
UPDATE...
term2 Observer la mise en attente
term1 Valider la transaction :
COMMIT;
term2 Vérifier le déblocage et que les deux mises à jour ont bien été effectuées (a multiplié par 6) :
SELECT...
term1 Vérifier que les deux mises à jour ont bien été effectuées (a multiplié par 6) :
SELECT...
Solution
-- term1
BEGIN TRANSACTION;
UPDATE test SET a=a*2;
-- term2
UPDATE test SET a=a*3;
-- attente...
-- term1
COMMIT;
-- term2
SELECT * FROM test;
a
----
6
12
-- term1
SELECT * FROM test;
a
----
6
12