comment tester si une fiche est vérouillée avec mysql ?

Le
patrice
bonjour

Il m'arrive souvent de vérouiller une fiche, avant de laisser l'utilisateur
modifié d'autres fiches.
par exemple, un entete de facture, et des lignes de factures
si quelqu'un d'autre veut modifier une facture en cours de modif, je test si
la fiche est lockée:
- si pas lockée, j'essaie de locker et je continue
- si lockée, zoli message: cette fiche est en cours d'utilisation

par contre en mysql ca marche comment ca ? déjà pour locker ca a pas l'air
simple, je sens que je vais devoir exécuter à la main un select for update.
mais je vois pas du tout comment tester si une fiche est lockée (un simple
lock provoque l'attente d'un timeout assez long, ce qui est un peu dommage
car c'est pas la peine d'essayer si on sait que la fiche est déjà lockée)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Roumegou Eric
Le #14628071
patrice a formulé ce vendredi :
bonjour

Il m'arrive souvent de vérouiller une fiche, avant de laisser l'utilisateur
modifié d'autres fiches.
par exemple, un entete de facture, et des lignes de factures
si quelqu'un d'autre veut modifier une facture en cours de modif, je test si
la fiche est lockée:
- si pas lockée, j'essaie de locker et je continue
- si lockée, zoli message: cette fiche est en cours d'utilisation

par contre en mysql ca marche comment ca ? déjà pour locker ca a pas l'air
simple, je sens que je vais devoir exécuter à la main un select for update.
mais je vois pas du tout comment tester si une fiche est lockée (un simple
lock provoque l'attente d'un timeout assez long, ce qui est un peu dommage
car c'est pas la peine d'essayer si on sait que la fiche est déjà lockée)



seul Innodb peut gérer les blocages dans mysql
et comme tu le dis tu as le pb du time out assez long.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Jacques Bratières
Le #14628051
Le Fri, 22 Jun 2007 16:45:11 +0200, Roumegou Eric a écrit:

patrice a formulé ce vendredi :
bonjour

Il m'arrive souvent de vérouiller une fiche, avant de laisser
l'utilisateur
modifié d'autres fiches.
par exemple, un entete de facture, et des lignes de factures
si quelqu'un d'autre veut modifier une facture en cours de modif, je
test si
la fiche est lockée:
- si pas lockée, j'essaie de locker et je continue
- si lockée, zoli message: cette fiche est en cours d'utilisation

par contre en mysql ca marche comment ca ? déjà pour locker ca a pas
l'air
simple, je sens que je vais devoir exécuter à la main un select for
update.
mais je vois pas du tout comment tester si une fiche est lockée (un
simple
lock provoque l'attente d'un timeout assez long, ce qui est un peu
dommage
car c'est pas la peine d'essayer si on sait que la fiche est déjà
lockée)



seul Innodb peut gérer les blocages dans mysql
et comme tu le dis tu as le pb du time out assez long.



Réponse à côté (mais peut être utile?): sous oracle select ... for update
nowait


--
J.Bratières
patrice
Le #14628041
C'est ca qu'est un peu dommage avec sql. vu de loin on a l'impression que
c'est un standard, mais des qu'on gratte en surface, on s'apercoit que l'on
ne pourra jamais porter son appli sans faire des spécificités selon la
database;

A ce propos, je viens de découvrir le group by de mysql se moque des
colonnes du select.

on peut donc faire select table1.*,count(table2.idtable2) from table1 left
join table2 on table1.idtable1=table2.idtable1
group by table1.idtable1

ce qui revient un peu au "premier" de access...

"Jacques Bratières" news:
Le Fri, 22 Jun 2007 16:45:11 +0200, Roumegou Eric >
Réponse à côté (mais peut être utile?): sous oracle select ... for update
nowait


--
J.Bratières


Firetox
Le #14628021
Bonjour,

pour le timeout c'est parametrable.
je met pour ma part 2 secondes

ensuite il existe d'autre solution : les semaphores
sous mySQL c'est set lock et release lock on donne un nom (je met la primary
key en nom comme ca pas de probleme

c'est un standard, mais des qu'on gratte en surface, on s'apercoit que
l'on
ne pourra jamais porter son appli sans faire des spécificités selon la
database;



c'est souvent le language de programmation qui est en cause sous c++ on a
des classe qui font ca
sous windev aussi mais cela s'appelle SQLManagerX. en fait dans les 2 cas
les bloque sont fait suaivant la base mais pour le developpeur c'est comme
sous windev un HlitBloque evoie des commandes differentes suivant les SGBD.

il y a 15 ans avec les langugage de 3 eme generation on devait le faire a la
mimine. et suivant le SGBD il fallait changer le code. les L4G ont ameiorés
cela, mais comme tout L4G ils previliegient toujours un SGBD. ou alors on
passe dans ces codes qui sont fait pour ca ADO par exemple en c++ et
SQLManagerX pour windev. les objets ADO font les requetes qui vont bien
(mais la aussi SQLServer est avantagé : devinez pourqoui)

bref pour mySQL
le lock doit etre dans une transaction et seul innodb le permet sinon passez
par des semaphores.

Bon dev
@+

Firetox



"patrice" 467bea7a$0$5101$
C'est ca qu'est un peu dommage avec sql. vu de loin on a l'impression que
c'est un standard, mais des qu'on gratte en surface, on s'apercoit que
l'on
ne pourra jamais porter son appli sans faire des spécificités selon la
database;

A ce propos, je viens de découvrir le group by de mysql se moque des
colonnes du select.

on peut donc faire select table1.*,count(table2.idtable2) from table1 left
join table2 on table1.idtable1=table2.idtable1
group by table1.idtable1

ce qui revient un peu au "premier" de access...

"Jacques Bratières" news:
Le Fri, 22 Jun 2007 16:45:11 +0200, Roumegou Eric
>
Réponse à côté (mais peut être utile?): sous oracle select ... for update
nowait


--
J.Bratières






Emmanuel LECOESTER
Le #14628011
"patrice" 467bea7a$0$5101$
C'est ca qu'est un peu dommage avec sql. vu de loin on a l'impression que
c'est un standard, mais des qu'on gratte en surface, on s'apercoit que
l'on
ne pourra jamais porter son appli sans faire des spécificités selon la
database;



Oui si tu utilises les siouxeries de la dite base de données. Je n'ai jamais
eu de problème d'adaptation du langage SQL. Les types diffèrent entre les
bases mais beaucoup d'équivalence de fonctions sont disponibles (voir le
lien favori de Eric R). En prenant comme principe de ne faire aucun calcul
dans la requete (concatenation de chaine, opération conditionnée) tu as une
quasi iso-fonctionnalité entre les différents SGBD.
Publicité
Poster une réponse
Anonyme