Lock à l'insert en mysql


Blini
WRInaute impliqué
WRInaute impliqué
 
Messages: 506
Inscription: 29 Nov 2004

Lock à l'insert en mysql

Message le Mar Aoû 16, 2005 6:48

Bonjour,

Quelle méthode préférez-vous pour locker une table au moment d'un insert en mysql ? Je précise le contexte: je veux insérer un nouveau record avec un nouvel ID = max(ID) + 1, le champ ID est unique et n'est PAS en auto-increment.
J'ai pour l'instant utilisé la méthode "select lock('chaine', timeout)", que je déclenche avant le selextmax(id) et que je release après l'insert, et je voudrais savoir ce que ça vaut. Et que vaut un vrai lock de la table en écriture par rapport à ce système de lock "par chaine" ?

Blini

Nikos38
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 44
Inscription: 23 Juin 2005

Message le Mar Aoû 16, 2005 10:55

Euh normalement l'accès concurrentiel doit être géré en natif sur mysql, c'est un peu le but(entre-autre) d'une base de données :D


Blini
WRInaute impliqué
WRInaute impliqué
 
Messages: 506
Inscription: 29 Nov 2004

Message le Mar Aoû 16, 2005 11:00

Euh, oui, mais quand tu fais:
1- id = select max(id)
2- insert into table values(id, ...)
Entre le point 1 et le point 2, un autre thread a très bien pu choper le même max(id), et là, accès concurrentiel ou pas, c'est à toi de locker manuellement pour t'assurer de pas te retrouver avec deux fois le même id...


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1673
Inscription: 14 Aoû 2002

Message le Mer Aoû 17, 2005 10:42

Bonjour
Dans le cas ou le critère 'id' n'a pas de valeurs identiques multiples sur ta base, tu peux déclarer un unique index sur le champ id, avec la clause 'add unique index' de mysql.

Voir l'aide 'info mysql' sous Linux ou l'aide sous Windows pour la syntaxe exacte.

Le fait que l'index soit unique fera que, si la valeur de id existe déjà ( a été insérée par quelqu'un dautre depuis qu'elle a été calculée ), à ce moment-là il y a une erreur MySQL au moment du mysql_query qui fait l'insert.

D'après la valeur de mysql_error(), tu peux gérer les cas de doublons intempestifs.

Bien à toi.

Jean Francois Ortolo


Blini
WRInaute impliqué
WRInaute impliqué
 
Messages: 506
Inscription: 29 Nov 2004

Message le Mer Aoû 17, 2005 11:25

Si je te suis, tu ferais donc un truc comme ça:
"Tant que c'est pas bon:
- selectionner le max(id)
- nouvelid = ce max + 1
- bon = mysql_query('insert ... values(nouvelid...)")
"

C'est fiable ?

Tex
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 449
Inscription: 9 Juil 2004

Message le Mer Aoû 17, 2005 11:28

pkoi ne pas le metre en auto increment justemment ?


Blini
WRInaute impliqué
WRInaute impliqué
 
Messages: 506
Inscription: 29 Nov 2004

Message le Mer Aoû 17, 2005 12:51

pour deux raisons:
1. c'est un exemple avec un ID, mais ça pourrait être une chaine de caractères
2. euhh... j'aime pas les autoincrement...


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités