Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Thu 03 February 2022 17:46

MaelReboux
Participant actif
Lieu: Roazhon / Rennnes
Date d'inscription: 24 Aug 2010
Messages: 72

QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

On m'a posé une colle sur la mise à jour de données dans PostGIS via QGIS.
Savoir si on peut faire de la maj multi-utilisateurs.
Pour moi comme il n'y a pas de mécanisme de verrou, le dernier qui UPDATE gagne.

J'ai bon ?

Je n'ai jamais pris le temps de regarder les logs postgreSQL pour voir ce que fait QGIS.

Vous croyez qu'il ouvre une transaction avant de balancer ses modifications ?


Service SIG Rennes Métropole
AITF : Coordinateur GT voies-adresse
Et un peu OSM Bzh

Hors ligne

 

#2 Fri 04 February 2022 08:43

Idir
Participant actif
Lieu: Perpignan
Date d'inscription: 28 Dec 2007
Messages: 95

Re: QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

Bonjour,

"faire de la maj multi-utilisateurs.", sur le même objet ou sur des objets différents dans la même couche ?

sur des objets différents dans la même couche, oui c'est possible, car postgreSQL le gère très bien.

IDIR

Hors ligne

 

#3 Fri 04 February 2022 11:38

haubourg
Participant assidu
Lieu: Grenoble
Date d'inscription: 7 Sep 2005
Messages: 257
Site web

Re: QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

Hello tout le monde (ça faisait longtemps que je n'étais pas passé ici)

PostgreSQL a un des moteur d'accès concurrentiel les plus solides du monde en effet.

QGIS, en lecture seule, n'a aucun cache pour PG et relis la donnée source à chaque action de zoom ou d'interrogation. On voit donc la toute dernière version des données en permanence, et les éditions "commitées" (sauvegardées) par les autres utilisateurs, en live.

En édition classique QGIS va ouvrir une transaction de lecture seule pour remplir son cache d'édition (editBuffer) pour les objets en cours de modification coté client, et son cache d'accrochage (snapping) sur la zone .

Cela ne pose aucun verrou coté postgres, c'est volontaire car c'est le cas majoritaire de la saisie multi-utilisateurs. Donc un utilisateur qui démarre une session d'édition locale  garde une version de sa donnée sur son poste, et l'écrira sur la base au moment d'appuyer sur le bouton "enregistrer". Le dernier a raison.

Il serait possible de faire évoluer QGIS pour permettre de choisir le type de verrou à poser coté postgreSQL, mais il faut alors passer à une logique de création de transactions longues, ce qui peut être assez lourd à gérer coté base pour les administrateurs de la base.

La bonne nouvelle, c'est que ça existe déjà partiellement !

Il s'agit du mode d'édition dit "par groupe de transaction" qui s'applique sur un projet QGIS (voir menu projet / propriétés).

Le principe est d'ouvrir une transaction longue, unique pour toutes les couches partageant la même chaîne de connexion (hôte + port + mode de connexion, etc..) et d'évaluer les modifications en les envoyant directement dans la base, et non plus dans le cache d'édition coté client QGIS.  En bref, QGIS ouvre une transaction avec "BEGIN" , puis envoie tous les UPDATE / INSERT / DELETE dans cette transaction.
Les éditions sont sauvegardées sous forme de SAVEPOINT afin de pouvoir faire des annuler (CTRL+Z)/refaire quand même.

Le bénéfice génial de ce mode, est que les triggers d'édition qui peuvent porter de la logique métier (calcul auto de valeurs, contrainte topologique et accrochage d'un réseau, etc..) sont évalués et permettent de faire des application métier bien plus légères coté QGIS.

Des verrous postgres sont posés sur les objets en cours de modification, et cela implique qu'un autre client qui voudrait écrire sur ces objets, avant la fin de la transaction longue, va juste... attendre. Avec l'impression que QGIS est "freezé", jusqu'au timeout de la transaction.

Autre problème, un utilisateur qui fait une transaction longue, mais ne sauvegarde pas, va progressivement geler l'ensemble des objets qu'il a modifié pour les autres. Donc c'est dangereux et nécessite des routines pour détruire les transactions trop longues. Avec le risque de perte réelle de données.

Un de mes rêves serait que QGIS ne soit pas silencieux vis à vis des verrous posés sur les données:
- en affichant en mode édition, une infobulle sur les objets actuellements verrouillés, avec des informations sur la session et la transaction en cause (id user, application_name, etc..)
- en autorisant l'utilisateur à abandonner une tentative de sauvegarde freezée
- en exploitant les canaux NOTIFY pour envoyer un message aux utilisateurs en édition pour monter une demande de libération de la transaction.  (sisi c'est possible !! , et pas si complexe)

En revanche, aller plus loin en proposant un modèle de workflow métier en clarifiant si des personnes sont prioritaires par rapport à d'autres, par exemple, ça rentre là dans le cas d'une application métier à clarifier.

Et à ce stade, on est presque sur les platebandes de l'édition collaborative type branches / versions / code source qu'on trouve dans pas mal de plugin et des outils tous neuf comme Kart. On parle là d'avoir des branches de données parallèles et d'offrir des outils de réconciliation. C'est une tout autre histoire à dérouler dans un autre thread.

Dans tous les cas, si il y a un enjeu de risque d'écrasement de données, je ne saurais que trop conseiller de mettre en place un "audit log", c'est à dire une historisation des éditions sur les couches de données à enjeux (certains appellent cela du versionning). Un très chouette plugin https://github.com/qwat/pg-history-viewer permet de visualiser des audit de type hstore/trigger   visualiser des diff de géométrie et attributs, et restaurer des versions antérieures.

Il existe des logiques d'historisation jsonb plus modernes, mais tout ça fonctionne!  (Attention à ne pas indexer ces historiques sinon ce sera lent, et pour les couches à forte dynamique de saisie, penser à purger l'historique pour ne pas saturer la base )


Régis

Hors ligne

 

#4 Fri 04 February 2022 12:36

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

Et bien, si ça c'est pas de la réponse détaillée...
Salut et merci Régis!

Hors ligne

 

#5 Mon 07 February 2022 11:25

MaelReboux
Participant actif
Lieu: Roazhon / Rennnes
Date d'inscription: 24 Aug 2010
Messages: 72

Re: QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

Merci pour la réponse très complète.

Il s'agit du mode d'édition dit "par groupe de transaction" qui s'applique sur un projet QGIS (voir menu projet / propriétés).


Je ne vois pas ça dans mon QGIS 3.16.

Le bénéfice génial de ce mode, est que les triggers d'édition qui peuvent porter de la logique métier (calcul auto de valeurs, contrainte topologique et accrochage d'un réseau, etc..) sont évalués


Coool !

pg-history-viewer


On met ça de côté. Faudrait trouver du temps pour évaluer Kart aussi...


Service SIG Rennes Métropole
AITF : Coordinateur GT voies-adresse
Et un peu OSM Bzh

Hors ligne

 

#6 Wed 09 February 2022 16:44

MaelReboux
Participant actif
Lieu: Roazhon / Rennnes
Date d'inscription: 24 Aug 2010
Messages: 72

Re: QGIS: Acces "concurrentiel" a PostGIS lors d'une MaJ de donnees

Alors je viens de procéder à un test de mise à jour d'un même objet par 2 utilisateurs différents et QGIS est très malin !
Si la mise à jour concerne 2 attributs différents : tout est synthétisé.
Je veux dire que le dernier à écrire n'écrase pas tous les attributs : l'UPDATE n'est fait que sur les attributs modifiés par l'utilisateur.


Service SIG Rennes Métropole
AITF : Coordinateur GT voies-adresse
Et un peu OSM Bzh

Hors ligne

 

Pied de page des forums

Powered by FluxBB