salut
Sebastien Grand a �crit :
>
> Salut,
> je ne connais pas mysql mais sous Oracle, il n'y a aucun probl�me:
> Lorsqu'une table est lock�e (par exemple pour ins�rer des donn�es), on peut
> toujours faire des select dessus.
> En fait, le lock emp�che deux personnes de modifier en m�me temps la m�me
> table.Il est donc impossible sur une table lock�e d'utiliser les commandes de
> manipulation des donn�es (LMD): UPDATE,INSERT, DELETE. Par contre
> l'interrogation des donn�es (LID) est possible SELECT.
>
> Par exemple, la personne qui fait un select sur une table lock�e ne voit pas
> encore les nouvelles lignes ins�rer (si la personne qui locke la table effectue
> des insertions), il voit la table dans son �tat initial avant le lock.Il faut
> que le commit soit effectu� pour voir les nouvelles lignes.
>
> Mais, je ne sais pas si mysql fonctionne de la m�me mani�re !
>
> Quelqu'un connaissant mysql pourra peut-�tre donner plus d'infos.
> Seb
>
> >Bonjour,
>
> >Je voudrais savoir :
> >Si je fais un lock sur une table, et qu'un autre thread essaye de faire un
> >select sur cette table, que se passe-t-il ?
> >1) select attend la liberation du lock (unlock) et execute sa requete
> >ou
> >2) select retourne une erreur
>
> >Merci !
>
> --
> >Alain
>
Extrait du manuel Mysql :
LOCK TABLES verrouille une table dans le thread courant. UNLOCK
TABLES ouvre tous les verrous pos� par le thread courant. Toutes les
tables
verrouill� par un thread sont automatiquement d�verrouill�e
quand le thread �met un autre LOCK TABLES, ou � la fin de la connexion
au serveur.
Si un thread obtiens le verrou de lecture (READ) sur une table,
le thread (et tous les autres threads) ne peut que lire dans la table.
Si un thread
obtiens e verrou de lecture (READ) sur une table, le thread qui
a le verrous est le seul � pouvoir lire ou �crire dans la table.
Les autres threads attendent (sans limite) que le verrous se
lib�re.
Le verrous d'�criture a une priorit� sup�rieure au verrou de
lecture, afin que les processus de mise � jour puisse se faire d�s que
possible. Cela
signifie que si un thread obtiens un verrou de lecture, et qu'un
autre thread obtiens un verrou d'�criture, alors le thread au verrou de
lecture
devra attendre la lib�ration du verrou d'�criture. Il est
possible d'utiliser des verrous d'�criture de basse priorit�
(LOW_PRIORITY WRITE), mais il
faut �tre sur qu'il y aura un moment ou aucun thread ne sera en
train de lire la table.
Lors de l'utilisation de la commande LOCK TABLES, il faut
verrouiller toutes les tables qui vont �tre utilis�es. Si il y a des
alias dans une requ�te,
il faut aussi avoir les verrous pour les alias! Cette politique
assure que la table ne se verrouille jamais, sans pouvoir �tre
d�verrouill�e.
Il ne faut jamais verrouiller une table qui va accepter une
insertion report�e (INSERT DELAYED). Car, dans ce cas, l'insertion sera
faite dans un
autre thread, qui n'aura pas le verrou.
G�n�ralement, il n'y a pas besoin de verrouiller les tables, car
les mise � jour UPDATE sont atomiques : aucun autre thread ne peut
interf�rer
avec la commande en cours d'�x�cution. Il y a toutes fois,
quelques cas o� il est bon de verrouiller une table :
Si un grand nombre d'op�ration vont �tre men�e sur un bon
nombre de table, il est plus rapide de verrouiller les tables utilis�es.
L'inconv�nient, bien sur, est qu'aucun autre thread ne
pourra acc�der aux informations, ni les modifier.
MySQL ne supporte pas d'environnement transactionnel, donc
il faut absolument verrouiller une table, pour s'assurer qu'au autre
thread n'intervient entre une commande SELECT et une
commande UPDATE . L'exemple ci-dessous montre comment ex�cuter une
transaction :
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> select sum(value) from trans where customer_id= some_id;
mysql> update customer set
total_value=sum_from_previous_statement
where customer_id=some_id;
mysql> UNLOCK TABLES;
Sans la commande LOCK TABLES, il se peut qu'un autre thread
ins�re une nouvelle ligne dans la table trans entre les deux commandes
SELECT
et UPDATE .
La gestion des verrous sous MySQL est inblocable. Cela est r�alis� en
demandant toujours tous les droits, en m�me temps, au d�but de la
requ�te, et en verrouillant toujours les tables dans le m�me
ordre.
La m�thode de verrouillage pour les verrous en �criture (WRITE )
est la suivante :
Si il n'y a pas de verrous sur la table, MySQL la
verrouille.
Sinon, il ajoute une demande de verrous dans la queue
d'attente.
La m�thode de verrouillage pour les verrous en lecture (READ)
est la suivante :
Si il n'y a pas de verrous sur la table, MySQL la
verrouille.
Sinon, il ajoute une demande de verrous dans la queue
d'attente.
Quand un verrou est lib�r�, le verrou est rendu disponible pour
les threads de la queue d'attente d'�criture, puis dans la queue
d'attente de
lecture.
Cela signifie que si vous avez de nombreuses modifications sur
une table, les commandes SELECT devront attente qu'il n'ya ait plus de
modifications en attente pour �tre satisfaites.
Pour �viter ce genre de probl�me, vous pouvez rassembler toutes
vos insertions dans une table temporaire, et faire une mise � jour
importante
de toute la table temporaire dans la fixe, une fois de temps en
temps. Cela se r�alise avec le code suivant :
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;
A+ Yann
webconcepteur
foudenuke.org http://foudenuke.org/foudenukefr/
webmaster
Independant Technologies http://it.forez.com
Celticbrothers http://celticbrothers.poulp.org
Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com"