web-dev-qa-db-fra.com

TRANSACTION MYSQL VS LOCK

J'ai une question concernant la gestion de la verrouillage et de la transaction MySQL. Ma question est ..does MySQL prend la serrure sur le tuple/table sur lequel je suis en train de sélectionner/mettre à jour dans une transaction?

5
matang

Avec Myisam, vous pouvez utiliser le concurrent_insert=2 Optimisation, où un INSERT ne bloquera pas les déclarations existantes ou nouvelles SELECT (mais bloquera tout autre chose).

Avec InnoDB, les règles sont:

  • SELECTs ne bloque jamais
  • Un UPDATE ou DELETE sur une ligne placera une serrure sur ladite ligne. Mais cela peut travailler même si la même ligne est d'être SELECTed.
  • Une deuxième mise à jour (sur une transaction simultanée) sur la même ligne bloquera jusqu'à ce que le premier soit engagé ou roulé.
  • INSERTs sont plus compliqués: si la table a une AUTO_INCREMENT, alors qui est verrouillé (bien que d'autres opérations simultanées soient autorisées si elles ne sont pas en concurrence pour AUTO_INCREMENT)
  • Certains concurrents INSERTs peuvent se bloquer les uns des autres car le verrouillage est effectué sur l'indice en cluster.
  • DELETEs, UPDATEs sur des plages sont également plus complexes et impliquer des blocs Firther en raison de verrous sur l'index en cluster.

Ce n'est probablement pas une liste complète, mais devrait vous obtenir la photo générale.

5
Shlomi Noach

( [~ # ~] myisam [~ # ~]

Chaque insertion, mise à jour et suppression effectue une serrure de table complète avant de jouer dans la commande SQL.

( innodb

MySQL - (( [~ # ~ ~] acide [~ # ~ ~] - Moteur de stockage conforme, Innodb effectue le niveau de rangée (TUPLE- niveau) verrouillage. InnoDB effectue [~ # ~] MVCC [~ # ~ ~] pour prendre en charge isolation de transaction . Le niveau d'isolement de la transaction dans les innodb sont

Il y a d'autres messages que j'ai pour regarder sur le point de voir comment InnoDB et Myisam diffèrent

3
RolandoMySQLDBA