Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1416 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Acces concurrent

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Acces concurrent

n°2068283
boblenain2​00
Posté le 05-04-2011 à 20:46:32  profilanswer
 

:hello:  
 
Que se passe t'il lors d'un accès concurrent en écriture dans une DB type PostegreSQL
Par exemple, 2 appli en parallèle tente d'ajouter un user, actuellement la BDD possède un user jusqu'à 10. Les 2 applis récupèrent donc cette valeur, l'incrémente de 1 chacune , et veulent écrire l'user.id 11 chacune, alors qu'en fait, l'une aurait du prendre l'id 12.
 
Comment gérer cette problématique ?

mood
Publicité
Posté le 05-04-2011 à 20:46:32  profilanswer
 

n°2068286
mr simon
Posté le 05-04-2011 à 21:10:40  profilanswer
 

le user.id est-il de type auto incremental ? ou le calcul tu au sein de ton application ?
 
je pencherais pour la second possibilite car postgre devrait savoir gerer ca tres bien.

n°2068287
esox_ch
Posté le 05-04-2011 à 21:12:36  profilanswer
 

Si tu veux être sûr tu mets les 2 opérations dans une transaction. Par contre attention à ne pas en abuser parce que sinon ça va te créer des problèmes..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2068288
boblenain2​00
Posté le 05-04-2011 à 21:17:22  profilanswer
 

Hum c'est vrai que l'auto increment peut aider..
Mais imaginons que c'est un traitement lambda (donc pas un auto increment), mais imaginons par exemple un compteur de visiteur.
Les 2 apps lisent 1100 visiteurs, chacune ajoute un et on se retrouve pourtant qu'avec 1101 visiteurs au lieu de 1102 ..
C'est ce genre de problème que j'aimerais éviter ..

n°2068289
boblenain2​00
Posté le 05-04-2011 à 21:18:06  profilanswer
 

esox_ch a écrit :

Si tu veux être sûr tu mets les 2 opérations dans une transaction. Par contre attention à ne pas en abuser parce que sinon ça va te créer des problèmes..


Les 2 applis tournent en parallèle me ne peuvent pas communiquer entre elle donc pas moyen de faire une transaction non ?

n°2068292
mr simon
Posté le 05-04-2011 à 21:22:10  profilanswer
 

boblenain200 a écrit :

Hum c'est vrai que l'auto increment peut aider..
Mais imaginons que c'est un traitement lambda (donc pas un auto increment), mais imaginons par exemple un compteur de visiteur.
Les 2 apps lisent 1100 visiteurs, chacune ajoute un et on se retrouve pourtant qu'avec 1101 visiteurs au lieu de 1102 ..
C'est ce genre de problème que j'aimerais éviter ..


 
Dans ce cas la, tu es oblige de faire la synchronization au niveau de ton code. Pour la transaction, ca doit etre possible aussi, mais je ne sais pas comment faire ...

n°2068293
mr simon
Posté le 05-04-2011 à 21:23:22  profilanswer
 

boblenain200 a écrit :


Les 2 applis tournent en parallèle me ne peuvent pas communiquer entre elle donc pas moyen de faire une transaction non ?


Ah si les deux applis tournent en //, c'est different ...
 
La solution que je vois dans ce cas est de locker la table pendant le traitement ...
http://www.postgresql.org/docs/8.1 [...] -lock.html

n°2068469
rufo
Pas me confondre avec Lycos!
Posté le 06-04-2011 à 16:48:10  profilanswer
 

boblenain200 a écrit :


Les 2 applis tournent en parallèle me ne peuvent pas communiquer entre elle donc pas moyen de faire une transaction non ?


 
Les transactions se font au niveau du SGBD. L'appli ouvre une transaction, fait ce qu'elle a à faire, puis ferme la transaction. Donc pas de pb mais faut pas qu'une transaction dure trop longtemps, sinon ça va nuire aux perfs.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2068474
mr simon
Posté le 06-04-2011 à 17:07:49  profilanswer
 

rufo a écrit :


 
Les transactions se font au niveau du SGBD. L'appli ouvre une transaction, fait ce qu'elle a à faire, puis ferme la transaction. Donc pas de pb mais faut pas qu'une transaction dure trop longtemps, sinon ça va nuire aux perfs.


 
Si tu as un transaction du type :

Code :
  1. begin tran
  2. declare @id int
  3. SELECT @id = max(id) FROM users
  4. SELECT @id = @id + 1
  5. INSERT INTO users VALUES (@id, 'toto')
  6. commit tran


 
Avec ce type de transaction, est-on sur que que @id sera toujours different ? Mon intuition est que sans lock, on peut avoir deux fois la meme valeur ...


Message édité par mr simon le 06-04-2011 à 17:08:09
n°2068481
rufo
Pas me confondre avec Lycos!
Posté le 06-04-2011 à 17:41:28  profilanswer
 

Je pense que ça doit dépendre des sgbd. Dans le début de la transaction, y'a effectivement peut-être à préciser le type de transaction (de type lecture, écriture dans une table, dans un enregistrement donné...).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le 06-04-2011 à 17:41:28  profilanswer
 

n°2068547
Oliiii
Posté le 07-04-2011 à 08:41:09  profilanswer
 

En general pour eviter le probleme et les transactions on met l'ID dans une autre table (qui peut contenir plusieurs ID de differente tables).
 
Pour recuperer le prochain ID on fait juste un

Code :
  1. UPDATE IDTable
  2.     SET ID += 1
  3. Output inserted.id
  4. WHERE TableName = 'MyTable'


 
Sans avoir a utiliser de longue transaction on recupere l'ID qu'on viens d'incrementer.
 
C'est pour SQL Server, mais je suppose que c'est tout a fait fesable avec MySQL.
 
L'avantage de ce systeme est qu'on n'est pas obligé d'utiliser des chiffres pour l'ID, ca peut etre quasi n'importe quoi.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Acces concurrent

 

Sujets relatifs
1120: Accès à la propriété non définie rewind erreur flash[Résolu] - Php droits d'accès
installation dbi via ppm pb acces activestate[Microsoft Visual Studio 2008]Exécuter une requête avec une base ACCES
[Résolu] Configurer WampServeur pour accès au localhostScript Accès Distant
Droit d'accès avec Alsa et Gtk (Gnu/Linux)Macro Excel : Accès restreint par onglet suivant utilisateur
[script batch] accès à la base de registreImportant : [Access]=> Accès concurrent ???
Plus de sujets relatifs à : Acces concurrent


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR