Mettre une instruction Select dans une transaction

10

Quelle est la différence entre ces 2 requêtes:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

Et sans transaction:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Quel est l'effet d'avoir SELECTune transaction interne?

Si a DELETE FROM orders WHERE id=1été appelé depuis une autre session juste après le SELECTdans les deux cas, quand sera-t-il traité?

Songo
la source

Réponses:

5

Une requête SELECT à l'intérieur d'une transaction, en elle-même, n'est pas correctement protégée des UPDATEs et DELETEs.

Ce dont vous avez besoin pour utiliser les éléments suivants:

Si vous émettez Delete From orders Where id=1, cela se produira une fois que les lignes du orderstableau auront libéré leurs verrous à la fin de la transaction. Vous pouvez expérimenter (sur un serveur de développement / de transfert, s'il vous plaît) avec l'utilisation du READ UNCOMMITTEDniveau d'isolation des transactions pour que la suppression se produise logiquement, mais ce n'est que lors de la validation qu'elle deviendra visible et enregistrée en permanence.

Dans la deuxième transaction, pratiquement tous les paris sont désactivés. Si vous courez

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

l'exécution Delete From orders Where id=1sera validée immédiatement. Selon l'ordre dans lequel MySQL exécute ces instructions, voyez-vous (ou ne voyez-vous pas) les lignes de suppression.

CAVEAT

MySQL 5.6 a maintenant les éléments suivants :

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

Les modificateurs READ WRITE et READ ONLY définissent le mode d'accès aux transactions. Ils autorisent ou interdisent les modifications des tables utilisées dans la transaction. La restriction LIRE SEULEMENT empêche la transaction de modifier ou de verrouiller les tables transactionnelles et non transactionnelles qui sont visibles pour les autres transactions; la transaction peut toujours modifier ou verrouiller les tables temporaires. Ces modificateurs sont disponibles à partir de MySQL 5.6.5.

RolandoMySQLDBA
la source