J’ai la problématique suivante : comment mettre à jour une table "table2" à partir d’une autre table en minimisant au maximum le temps de verrouillage et l'indisponibilité pour les utilisateurs effectuant des requêtes en select sur "table2" ?
Réponse :
Tu n'as rien à faire de particulier, c'est géré par le SGBD.
En ce qui concerne le verrouillage, il y a un principe général avec PostgreSQL comme Oracle Database : les écritures ne bloquent pas les lectures et inversement.
Le DML (insert, delete, update) que tu vas faire dans ton batch ne bloquera pas les requêtes (select) des utilisateurs.
Si tu ne veux pas que les utilisateurs voient de résultats incohérents, il faut que le traitement soit réalisé en une seule transaction.
Exemple :
Code : Tout sélectionner
select version();
version
---------------------------------------------------------------------------------------------------------------
PostgreSQL 11.1 (Debian 11.1-1.pgdg+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.2.0-9) 8.2.0, 64-bit
(1 ligne)
\d t1
Table « postgres.t1 »
Colonne | Type | Collationnement | NULL-able | Par défaut
---------+---------+-----------------+-----------+------------
c1 | integer | | |
-- session utilisateur
table t1;
c1
----
1
2
3
(3 lignes)
-- session batch
start transaction;
START TRANSACTION
delete from t1;
DELETE 3
insert into t1(4),(5),(6);
INSERT 0 3
-- session utilisateur
table t1;
c1
----
1
2
3
(3 lignes)
-- session batch
commit;
COMMIT
-- session utilisateur
table t1;
c1
----
4
5
6
(3 lignes)