Requêtes (SELECT) pendant un batch

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 196
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Requêtes (SELECT) pendant un batch

Message par Phil » mar. 20 nov. 2018 15:09

Merci à Lionel pour sa question :

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)
Attention évidemment si le batch est très long, s'il traite un volume important etc.
Cdlt. Phil - pgphil.ovh

Répondre