112 votes

Un moyen de sélectionner sans provoquer de verrouillage dans MySQL?

<p>Requête :<pre><code></code></pre><p>Mais en ligne table est également modifiée par un événement, si souvent je vois de blocage en exécutant <code></code> .</p><p>Y a-t-il une grammaire dans MySQL qui peut rendre l’instruction ne causant ne pas de verrous de sélection ?</p><p>Et j’ai oublié de mentionner plus haut que c’est sur une base de données de l’esclave MySQL.</p><p>Après j’ai ajouté dans <code></code> l’esclave se réuniront avec l’erreur :</p><pre><code></code></pre><p>Alors, est-il un moyen compatible pour cela ?</p></p>

139voto

Jon Erickson Points 29643

Trouvé un article intitulé "MYSQL AVEC NOLOCK"

http://www.sqldba.org/articles/22-mysql-with-nolock.aspx

dans MSSQL vous effectuez les opérations suivantes:

SELECT * FROM TABLE_NAME WITH (nolock)

et le MYSQL est équivalent

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

MODIFIER

Michael Mior suggéré ce qui suit (d'après les commentaires)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;

20voto

Alex Martelli Points 330805
<p>Si la table InnoDB, voir <a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html">http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html</a> --il utilise lecture cohérente (mode de verrouillage non) pour sélectionner « qui ne spécifiez pas de mise à jour ou LOCK IN SHARE MODE Si l’innodb_locks_unsafe_for_binlog option 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éfinies sur les lignes lues à partir de la table sélectionnée ».</p>

16voto

Chris Lively Points 59564
<p>Utilisation<p><code></code></p><p>Docs sont <a href="http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html" rel="nofollow">ici</a>.</p></p>

13voto

zombat Points 46702

Vous pouvez lire cette page de manuel MySQL. Comment une table se bloque dépend de quel type de table c'est.

MyISAM utilise des verrous de table pour atteindre une très haute vitesse de lecture, mais si vous avez une instruction de mise à JOUR en attente, alors l'avenir SÉLECTIONNE mettra en file d'attente derrière la mise à JOUR.

Les tables InnoDB utiliser le verrouillage de ligne, et vous n'aurez pas l'ensemble du tableau de verrouiller derrière une mise à JOUR. Il existe d'autres types de problèmes de verrouillage associés avec InnoDB, mais vous pourriez trouver qu'il s'adapte à vos besoins.

2voto

Brent Baisley Points 877

En fonction de votre type de table, verrouillage d'effectuer différemment, mais ce sera un SELECT count. Pour les tables MyISAM un simple SELECT count(*) FROM table ne doit pas verrouiller la table depuis, il a accès aux méta-données pour tirer le nombre d'enregistrements. Innodb va prendre plus de temps car il doit saisir la table en un clin d'œil à compter les enregistrements, mais il ne devrait pas provoquer de blocage.

Vous devriez au moins avoir concurrent_insert la valeur 1 (par défaut). Ensuite, si il n'y a pas les "trous" dans le fichier de données pour le tableau à remplir, d'insertions seront ajoutées au fichier et SÉLECTIONNEZ et INSERTs peuvent se produire simultanément avec les tables MyISAM. Notez que la suppression d'un enregistrement met un "écart" dans le fichier de données qui tentera d'être rempli avec de l'avenir insertions et mises à jour.

Si vous supprimez rarement les dossiers, alors vous pouvez définir concurrent_insert égal à 2, et insère sera toujours ajouté à la fin du fichier de données. Ensuite, sélectionne et inserts peuvent se produire simultanément, mais votre fichier de données ne sera jamais plus petites, peu importe le nombre d'enregistrements que vous supprimez (à l'exception de tous les enregistrements).

La ligne du bas, si vous avez beaucoup de mises à jour, les insertions et les sélectionne sur une table, vous devez faire InnoDB. Vous pouvez combiner des types de table dans un système si.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: