Lock à l'insert en mysql

  • Auteur de la discussion Auteur de la discussion Blini
  • Date de début Date de début
WRInaute occasionnel
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
 
Nouveau WRInaute
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
 
WRInaute occasionnel
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...
 
WRInaute accro
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
 
WRInaute occasionnel
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 ?
 
WRInaute occasionnel
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...
 
Discussions similaires
Haut