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 mydbpsql mydb
Créer une table
test:CREATE TABLE test (a integer);
Question
term1 Insérer une valeur :
INSERT ...(COMMITimplicite)term2 Vérifier que la valeur est visible :
SELECT ...
Solution
-- term1INSERT INTO test(a) VALUES (1);
-- term2SELECT * 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
-- term1BEGIN TRANSACTION;INSERT INTO test(a) VALUES (2);
SELECT * FROM test;
a
---
1
2
-- term2SELECT * FROM test;
a
---
1
-- term1COMMIT;
-- term2SELECT * 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
-- term1BEGIN TRANSACTION;UPDATE test SET a=a*2;
-- term2UPDATE test SET a=a*3;
-- attente...-- term1COMMIT;
-- term2SELECT * FROM test;
a
----
6
12
-- term1SELECT * FROM test;
a
----
6
12