web-dev-qa-db-fra.com

Mettre une instruction Select dans une transaction

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 un SELECT à l'intérieur d'une transaction?

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

10
Songo

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 de la table orders 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 de READ UNCOMMITTED niveau d'isolement de la transaction pour que la suppression se produise logiquement, mais uniquement lors de la validation, elle sera 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;

fonctionnement Delete From orders Where id=1 s'engage 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.

5
RolandoMySQLDBA