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 orders
tableau 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 UNCOMMITTED
niveau 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=1
sera 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