Question Clarifier la différence entre le verrouillage au niveau de la ligne dans le moteur InnoDB et le verrouillage au niveau de la table dans le moteur MyISAM dans la base de données MySQL


Disons que j'ai deux utilisateurs essayant d'atteindre une table dans la base de données appelée "commentaires" dans l'ordre suivant:

  1. User1 fait et met à jour pour un enregistrement avec id = 10

    UPDATE comments SET comment = "Hello World" WHERE id = 10

  2. User2 effectue une sélection pour toutes les lignes des mêmes commentaires de table

    SELECT * FROM commentaires

Je veux discuter de la différence entre les cas suivants:

  1. Si le moteur de la table est MyISAM: la requête de mise à jour verrouille le toute la table qui mettra en file d'attente la requête select jusqu'à la mise à jour de la rangée est terminée et ensuite elle sera exécutée ce qui arrêtera tout utilisateur de demander quelque chose de cette table jusqu'à ce que la mise à jour est fini.
  2. Si le moteur de la table est InnoDB: la requête de mise à jour verrouille la ligne mise à jour.

Je veux savoir comment ce verrou affecte la requête de sélection?

Je veux dire si le select demande à la base de données la totalité des enregistrements de la table des commentaires et trouve l'un d'entre eux (id = 10) verrouillé, la base de données met-elle en file d'attente la sélection jusqu'à ce que la mise à jour soit terminée?

Si oui alors quelle est la différence entre les deux moteurs ??

Si non, je veux dire que j'ai la même situation dans mon site Web et j'ai même changé mes moteurs de tables de MyISAM à InnoDB mais le problème de la mise en file d'attente de toutes les demandes de mise à jour ou d'insertion est toujours d'actualité.

Toute explication à cette situation sera très utile. Merci d'avance


12
2017-11-24 10:51


origine


Réponses:


Dans InnoDB, cela dépend si la transaction est activée ou non. InnoDB a une fonctionnalité MVCC qui signifie que pendant la mise à jour du thread 1, le thread 2 peut lire sans verrou.

c'est déjà répondu ici La ligne d'InnoDB verrouillant le même que les lectures non bloquantes MVCC?

si la transaction est désactivée, même avec MyISAM? Je suppose que oui mais pas sûr.


1
2017-11-24 11:03



Dans Innodb dans votre scénario, le résultat viendra pour la requête select mais avec les anciennes données pour la ligne où id = 10 si elle n'est pas mise à jour. Le résultat ne s'arrêtera pas.


0
2018-01-16 10:40