Mini-TP : Simulation d'accès concurrents sous PostgreSQL

  1. Se connecter deux fois à une même base de données dans deux terminaux (term1 et term2) :

    • psql mydb

    • psql mydb

  2. Créer une table test : CREATE TABLE test (a integer);

Question

  1. term1 Insérer une valeur : INSERT ... (COMMIT implicite)

  2. term2 Vérifier que la valeur est visible : SELECT ...

Solution

1
-- term1
2
INSERT INTO test(a) VALUES (1);
1
-- term2
2
SELECT * FROM test;
1
 a 
2
---
3
 1

Question

  1. term1 Commencer une transaction : BEGIN TRANSACTION;

  2. term1 Insérer la valeur 2 dans la table : INSERT INTO...

  3. term1 Vérifier que la valeur est bien dans la table : SELECT * FROM ...

  4. term2 Vérifier que la valeur n'est pas visible : SELECT * FROM ...

  5. term1 Valider la transaction : COMMIT;

  6. term2 Vérifier que la valeur est visible : SELECT * FROM ...

Solution

1
-- term1
2
BEGIN TRANSACTION;
3
INSERT INTO test(a) VALUES (2);
4
SELECT * FROM test;
5
1
 a 
2
---
3
 1
4
 2
1
-- term2
2
SELECT * FROM test;
1
 a 
2
---
3
 1
1
-- term1
2
COMMIT;
3
1
-- term2
2
SELECT * FROM test;
1
 a 
2
---
3
 1
4
 2

Question

  1. term1 Commencer une transaction : BEGIN TRANSACTION;

  2. term1 Exécuter une mise à jour (multiplier toutes les valeurs par 2) : UPDATE...

  3. term2 Exécuter une mise à jour concurrente (multiplier les valeurs par 3) : UPDATE...

  4. term2 Observer la mise en attente

  5. term1 Valider la transaction : COMMIT;

  6. term2 Vérifier le déblocage et que les deux mises à jour ont bien été effectuées (a multiplié par 6) : SELECT...

  7. term1 Vérifier que les deux mises à jour ont bien été effectuées (a multiplié par 6) : SELECT...

Solution

1
-- term1
2
BEGIN TRANSACTION;
3
UPDATE test SET a=a*2;
4
1
-- term2
2
UPDATE test SET a=a*3;
3
-- attente...
1
-- term1
2
COMMIT;
1
-- term2
2
SELECT * FROM test;
1
 a 
2
----
3
  6
4
 12
1
-- term1
2
SELECT * FROM test;
1
 a 
2
----
3
  6
4
 12