2010-01-07 10 views
3

Il semble que les requêtes de contenu de sélection mysql (par opposition à par exemple) prennent toujours au moins un verrou de lecture de table sur les tables myisam et un verrou de lecture de ligne sur les tables innodb. Existe-t-il un moyen d'émettre une requête de contenu select dans mysql (je pourrais changer le type de table si nécessaire) sans avoir à récupérer des verrous? Cela ne me dérange pas si les données retournées sont incohérentes puisque je vais l'utiliser pour un index de recherche.Est-il possible d'émettre une requête de sélection dans mysql sans prendre de verrous de lecture?

Répondre

4

Avec InnoDB vous y parvenir en réglant le niveau d'isolement de transaction: READ UNCOMMITTED.

Dans ce niveau d'isolement:

instructions SELECT sont effectuées dans un mode non bloquant, mais une possible version antérieure d'une ligne peut être utilisés. Ainsi, en utilisant ce niveau d'isolement , de telles lectures ne sont pas cohérentes. Cette opération est également appelée «lecture incorrecte». Sinon, ce niveau d'isolement fonctionne comme comme READ COMMITTED.

Vous pouvez modifier le niveau d'isolation des transactions par défaut à partir du fichier d'options MySQL, ou bien il peut être activé et désactivé pour une session unique:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
SELECT * FROM table_name; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 

Lectures complémentaires: MySQL Documentation: Set Transaction

+0

ok. donc pas possible avec les tables myisam et possible avec innodb talbes en mettant en lecture non validée? – Peder

+0

Il semble que le niveau d'isolement 'READ UNCOMMITTED' fera exactement ce dont vous avez besoin dans InnoDB. Si vous voulez conserver MyISAM, notez qu'il ne prend pas en charge le verrouillage au niveau des lignes, mais uniquement les verrous de table, comme vous l'avez remarqué. Cependant, il utilise différents types de verrous de table. Par exemple, il existe des verrous partagés (verrous en lecture) pour les sélections et des verrous exclusifs (en écriture) pour les opérations d'écriture. Il y a aussi un verrou spécial READ LOCAL pour permettre les insertions lors des sélections. –

+0

Notez également que plusieurs sessions peuvent acquérir un verrou READ pour une table MyISAM en même temps. Seules les opérations d'écriture seront mises en file d'attente. Si vous avez beaucoup d'opérations d'écriture, alors vous devriez vraiment considérer InnoDB. Sinon, si les opérations d'écriture sont rares, vous pouvez probablement conserver le verrou de lecture par défaut sur MyISAM lors de l'utilisation des sélections, car ce verrou n'est pas exclusif: il peut être acquis par de nombreuses autres sessions, tant qu'elles ne tentent pas d'écriture . –

1

en l'absence de LOCK TABLES, MyISAM doit être équivalent à lire le mode non engagé, mais il ne supporte pas vraiment tous les types de transaction ...

InnoDB fonctionne en mode « lecture cohérente » (à « lecture répétée "niveau d'isolation) par défaut, les documents suggèrent ne se verrouille pas:

Si le niveau d'isolation des transactions est REPEATABLE READ (le niveau par défaut), toutes les lectures cohérentes dans la même transaction lire l'instantané établi par le premier tel lu dans cette transaction

...

lecture cohérente est le mode par défaut dans lequel les processus InnoDB SELECT énoncés dans READ COMMITTED et niveaux d'isolement de lecture répétable. Une lecture cohérente ne pose aucun verrou sur les tables auxquelles il accède et donc d'autres sessions sont libres de modifier ces tables en même temps une lecture cohérente est en cours d'exécution sur la table.

...

InnoDB utilise une lecture cohérente pour sélectionner des clauses comme INSERT INTO ... SELECT, UPDATE ... (SELECT) et CREATE TABLE ... SELECT qui ne sont pas spécifiez FOR UPDATE ou LOCK IN SHARE MODE si l'option innodb_locks_unsafe_for_binlog est définie et que le niveau d'isolement de la transaction n'est pas défini sur SERIALIZABLE. Ainsi, aucun verrou n'est défini sur les lignes lues dans la table sélectionnée.

http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

+0

ok. Donc, vous dites que je n'ai même pas besoin de définir le niveau de transaction à lire non engagé pour les tables innodb comme vasallo suggéré? désolé mais je ne comprends pas cela "en l'absence de LOCK TABLES, myisam devrait être équivalent à lire le mode non engagé" – Peder