web-dev-qa-db-fra.com

ligne verrouillage dans la transaction acide innodb

J'ai une transaction financière qui ressemble à quelque chose comme ça (pseudo):

begin
    select record for update
    update record(same record as selected)
    insert another record into another table
commit

Si j'appelle SELECT ... FOR UPDATE Dans la transaction, le verrouillage sera-t-il libéré pour les lignes spécifiques que lorsque la transaction est commise?

2
tommo

Selon la page 418 Paragraphe 3 de Guide d'étude de certification MySQL 5.

MySQL 5.0 Certification Study Guide

les commandes suivantes peuvent casser une transaction

  • ALTER TABLE
  • BEGIN
  • CREATE INDEX
  • DROP DATABASE
  • DROP INDEX
  • DROP TABLE
  • RENAME TABLE
  • TRUNCATE TABLE
  • LOCK TABLES
  • UNLOCK TABLES
  • SET AUTOCOMMIT = 1
  • START TRANSACTION

Tant que vous n'êtes pas de ces commandes dans la transaction, la transaction doit être stable. En fait, Select for Update est si fort que les verrouillages de la ligne envahissent les index ainsi que les données. Il pourrait même mettre en place des impacts d'innodb éventuels. J'ai écrit une fois à ce sujet à ce poste: Sélectionner pour la mise à jour donne une erreur sur la colonne indexée

Tant que vous gardez des transactions courtes et douces, SELECT FOR UPDATE ne devrait pas être un problème. Si vous souhaitez protéger votre transaction des blocages intermittents ou inattendus, MySQL 5.6 présente maintenant ce qui suit:

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Vous devriez commencer la transaction avec des options telles que celles-ci. Pourquoi ?

Selon cette documentation MySQL :

Les modificateurs d'écriture de lecture et de lecture de lecture définissent le mode d'accès à la transaction. Ils permettent ou interdisent les modifications apportées aux tables utilisées dans la transaction. La restriction en lecture seule empêche la transaction de modifier ou de verrouiller des tables transactionnelles et non entraînantes visibles à d'autres transactions; La transaction peut toujours modifier ou verrouiller des tables temporaires. Ces modificateurs sont disponibles à partir de MySQL 5.6.5.

Votre dernier commentaire était

alors puis-je verrouiller des lignes dans une transaction d'une autre manière à la mise à jour

Vous pouvez également exécuter Sélectionnez ... verrouillage en mode de partage . La documentation dit

  • Sélectionnez ... verrouillage en mode Share définit un verrouillage en mode partagé sur toutes les lignes lues. D'autres sessions peuvent lire les lignes, mais ne peuvent pas les modifier tant que votre transaction s'engage. Si l'une de ces lignes a été modifiée par une autre transaction qui ne s'est pas encore engagée, votre requête attend que cette transaction se termine, puis utilise les dernières valeurs.
  • Pour les enregistrements d'index Les rencontres de recherche, sélectionnez ... Pour que la mise à jour, les lignes et les entrées d'index associées, identiques à si vous avez publié une déclaration de mise à jour pour ces lignes. D'autres transactions sont bloquées de la mise à jour de ces lignes, de la section Sélectionner ... verrouillent le mode d'actions ou de la lecture des données dans certains niveaux d'isolation des transactions. Les lectures cohérentes ignorent les verrouillages définis sur les enregistrements existants dans la vue en lecture. (Les anciennes versions d'un enregistrement ne peuvent pas être verrouillées; ils sont reconstruits en appliquant des journaux d'annulation sur une copie en mémoire de l'enregistrement.)

Bien que possible, gardez les transactions courtes. Sinon, vous pouvez augmenter la probabilité d'impasse.

Mise à jour 2014-02-13 21:57 Est

Pour effacer toutes les idées fausses, Veuillez noter ceci à partir de la documentation MySQL :

Tous les verrous définis par verrouillage en mode d'actions et pour la mise à jour Les requêtes sont libérées lorsque la transaction est commise ou roulée.

Par conséquent, si vous exécutez Sélectionnez ... Verrouiller en mode de partage Dans une transaction, les rangées restent verrouillées jusqu'à ce que la transaction s'engage ou roule.

4
RolandoMySQLDBA

Boucle également si le gestionnaire d'exception est hors de boucle et que la portée de la transaction est en boucle, même la transaction de MySQL enfreint la transaction à une exception, mieux déclarer le gestionnaire d'exceptions, le cas échéant, la transaction de la même portée a été déclarée.

1
satya