PSP, Base de données et accès concurent - Python - Programmation
Marsh Posté le 13-08-2009 à 21:04:00
axel584 a écrit : Bonjour,
|
C'est plus une question spécifique aux bdd qu'à Python. Chaque connection à une bdd est gérée par le serveur. Il attribue au client un identificateur de connection.
Ensuite, quand le serveur reçoit une requête, il sait de qui ça vient grâce à l'identificateur qui est associé.
Le vrai problème peut survenir si les deux clients modifient la même info d'une même table en même temps. Si la modif est faite de façon banale, alors le serveur recevant les deux requêtes les exécutera en séquentiel et c'est la dernière qui gagnera.
Généralement, pour éviter ce genre de cas, on pose un verrou sur l'enregistrement en cours de traitement. Le verrou peut-être en mode "lecture seule" (les autres peuvent toujours lire l'info mais pas la modifier) ou en mode "exclusif".
Pour en revenir à Python, j'ai découvert un problème justement à propos de l'info visualisée.
Voici 2 scripts
script1.py: il crée une bdd et une table et il y stocke 3 infos. Puis il va lire les infos, attend ensuite une frappe clavier puis relit les infos
Code :
|
script2.py: il se connecte à la bdd et y insère des data
Code :
|
Donc le principe est de lancer le script1. Il crée la bdd, puis la table, puis il la remplit puis l'affiche et se met en attente d'une frappe clavier.
Pendant qu'il est en attente, on lance le script2 autant de fois qu'on désire. A chaque lancement, il stocke 2 infos dans la table puis l'affiche. On voit ainsi la table grossir.
On revient enfin au script1 et on valide la saisie. Le script1 réaffiche le contenu de la table. Théoriquement, on devrait avoir toutes les infos insérées par le script2. Or, sous Windows, on n'a que les infos du début. Si on veut tout avoir, il est nécessaire de refaire un connect(). Il semblerait que l'interface windows d'accès à MySQL conserve en cache les data. Ce problème ne se produit pas sous Linux...
Marsh Posté le 11-06-2010 à 10:05:27
en fait, c'est un problème spécifique aux accès concurrents à partir d'un même programme threadé (en l'occurence le serveur web).
J'ai fini par résoudre mon problème en utilisant une lib qui interface la lib mysqldb et qui gère les threads correctement.
Cette lib s'appelle PySQLPool
Je ne sais plus trop où je l'ai trouvé, mais ça pourrait aider d'autres personnes.
Axel
Marsh Posté le 11-06-2010 à 22:24:21
axel584 a écrit : en fait, c'est un problème spécifique aux accès concurrents à partir d'un même programme threadé (en l'occurence le serveur web). |
Hey, 1 an plus tard !!! vieux motard que jamais
Perso, je suis passé depuis à PostgreSQL et là, zéro soucy. Que ce soit sous Zindow ou Linux (enfin sous Linux c'est normal), les deux scripts ci-dessus portés sous PostgreSQL (psycopg2) fonctionnent comme on est en droit de s'y attendre => les infos écrites par le script2 sont lues dans le script1 sans qu'on ait besoin de se reconnecter. Depuis j'ai adopté PostgreSQL (surtout quand j'ai exploré ses possibilités en matières d'indexation ou de foreign keys )
Marsh Posté le 06-07-2009 à 13:04:19
Bonjour,
J'ai un peu l'habitude de faire des scripts pythons en mode texte pour faire des modifs en base de données, et là, je dois faire un petit site en PSP.
Pour l'instant, j'ai fait des pages qui contienne un import :
from configdb import *
Et un fichier configdb.py qui contient ça :
Mais j'ai l'impression que la "connection" est parfois perdu et je ne comprends pas très bien comment les choses fonctionnent quand deux personnes se connectent en même temps ?
Est ce qu'il y a un seul objet connectionMy qui est utilisé par les deux personnes ? est ce qu'il y a un nouvel objet connectionMy à chaque fois que quelqu'un accède à la page ?
Bref, ne comprenant pas trop comment ça fonctionne, j'ai du mal à savoir comment je pourrais corriger les choses.
Merci pour votre aide,
Axel