Requete:
SELECT COUNT(online.account_id) cnt from online;
Mais la table en ligne est également modifiée par un événement, si souvent je peux voir le verrouillage en courant show processlist
.
Y a-t-il une grammaire dans MySQL qui peut faire que l'instruction select ne provoque pas de verrous?
Et j'ai oublié de mentionner ci-dessus que c'est sur une base de données esclave MySQL.
Après avoir ajouté dans my.cnf:transaction-isolation = READ-UNCOMMITTED
l'esclave rencontrera une erreur:
Erreur 'La journalisation binaire n'est pas possible. Message: Le niveau de transaction 'READ-UNCOMMITTED' dans InnoDB n'est pas sûr pour le mode binlog 'STATEMENT' 'sur requête
Alors, y a-t-il un moyen compatible de faire cela?
Réponses:
Vous avez trouvé un article intitulé "MYSQL WITH NOLOCK"
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
dans MS SQL Server, vous procédez comme suit:
et l'équivalent MYSQL est
ÉDITER
Michael Mior a suggéré ce qui suit (à partir des commentaires)
la source
SESSION
et ainsi faire appliquer le niveau de transaction uniquement à la prochaine transaction. Ensuite, remplacez simplement la troisième instruction ci-dessus parCOMMIT
. Ce sera un noop dans ce cas, mais cela aura pour effet secondaire de mettre fin à la transaction et de réinitialiser au niveau d'isolement par défaut.SET TRANSACTION
instruction déclare: "Cette instruction définit le niveau d'isolation des transactions, utilisé pour les opérations sur les tables InnoDB."Si la table est InnoDB, voir http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - il utilise consistent-read (mode sans verrouillage) pour les SELECT "qui font ne spécifiez pas 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 à partir de la table sélectionnée ".
la source
Utilisation
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
Les documents de la version 5.0 sont disponibles .
Les documents de la version 5.1 sont disponibles .
la source
Vous voudrez peut-être lire cette page du manuel MySQL. La façon dont une table est verrouillée dépend du type de table dont il s'agit.
MyISAM utilise des verrous de table pour atteindre une vitesse de lecture très élevée, mais si vous avez une instruction UPDATE en attente, alors les futurs SELECTS feront la queue derrière UPDATE.
Les tables InnoDB utilisent le verrouillage au niveau des lignes, et vous n'aurez pas la table entière verrouillée derrière une UPDATE. Il existe d'autres types de problèmes de verrouillage associés à InnoDB, mais vous trouverez peut-être que cela répond à vos besoins.
la source
Selon le type de votre table, le verrouillage fonctionnera différemment, mais il en sera de même pour un décompte SELECT. Pour les tables MyISAM, une simple table SELECT count (*) FROM ne doit pas verrouiller la table car elle accède aux métadonnées pour extraire le nombre d'enregistrements. Innodb prendra plus de temps car il doit saisir la table dans un instantané pour compter les enregistrements, mais cela ne devrait pas provoquer de verrouillage.
Vous devriez au moins avoir concourant_insert défini sur 1 (par défaut). Ensuite, s'il n'y a pas de "lacunes" dans le fichier de données à remplir pour la table, des insertions seront ajoutées au fichier et SELECT et INSERT peuvent se produire simultanément avec les tables MyISAM. Notez que la suppression d'un enregistrement met un «vide» dans le fichier de données qui tentera d'être rempli par les insertions et mises à jour futures.
Si vous supprimez rarement des enregistrements, vous pouvez définir concurrent_insert égal à 2 et les insertions seront toujours ajoutées à la fin du fichier de données. Ensuite, les sélections et les insertions peuvent se produire simultanément, mais votre fichier de données ne sera jamais plus petit, quel que soit le nombre d'enregistrements que vous supprimez (à l'exception de tous les enregistrements).
En fin de compte, si vous avez beaucoup de mises à jour, d'insertions et de sélections sur une table, vous devriez en faire InnoDB. Vous pouvez cependant mélanger librement les types de table dans un système.
la source
une autre façon d'activer la lecture sale dans mysql est d'ajouter un indice: LOCK IN SHARE MODE
la source
De cette référence:
la source
Les SELECTs n'effectuent normalement aucun verrouillage qui vous tient à cœur sur les tables InnoDB. Le niveau d'isolation de transaction par défaut signifie que les sélections ne verrouillent pas les choses.
Bien sûr, la contestation se produit toujours.
la source
show processlist
pour voir réellement les verrous. Il est donc prudent de supposer que des verrous sont effectivement pris.