La principale recherche de cet article est l'introduction et les exemples du niveau d'isolement des transactions de printemps, comme suit.
Lorsque deux transactions fonctionnent sur des enregistrements dans la même base de données, quel est l'impact entre eux? Cela soulève le concept de niveau d'isolement des transactions. L'isolement de la base de données a beaucoup à voir avec le contrôle de la concurrence. Le niveau d'isolement de la base de données fait partie de l'acide de la caractéristique transactionnelle de la base de données. L'acide, c'est-à-dire l'atomicité, la cohérence, l'isolement et la durabilité. Spring a quatre niveaux d'isolement des transactions: READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ et SERIALIZABLE . Un autre est le niveau d'isolement par défaut de la DEFAULT de la base de données, et MySQL par défaut à REPEATABLE_READ .
Jetons un coup d'œil en détail ci-dessous.
Comme son nom l'indique, READ_UNCOMMITTED signifie qu'une transaction peut lire des enregistrements de transaction qu'une autre transaction n'a pas été engagée. En d'autres termes, une transaction peut lire les données qui ne sont toujours pas engagées par d'autres transactions. Il s'agit du niveau d'isolement le plus faible pour les transactions de printemps. Voir la figure ci-dessous, la transaction A est activée et un enregistrement est écrit. À l'heure actuelle, la transaction B lit les données et lit cet enregistrement, mais la transaction a un retournement. Par conséquent, les données lues par la transaction B ne sont pas valides (la base de données est dans un état non valide). Cette situation est appelée Dirty Read. En plus du problème de lecture sale, READ_UNCOMMITTED peut également avoir non-repeatable read (pas de lecture répétitive) et phantom read (lecture fantôme).
Le niveau d'isolement READ_COMMITTED indique qu'une transaction ne peut lire que les enregistrements engagés et ne peut pas lire les enregistrements non engagés. En d'autres termes, une transaction ne peut lire que les données engagées, et elle ne peut pas lire les données non engagées. Par conséquent, la situation de lecture sale ne se produit plus, mais d'autres problèmes peuvent survenir. Voir l'image ci-dessous.
Entre les deux lectures de la transaction A, la transaction B modifie ce enregistrement et la commet. Par conséquent, les enregistrements lus avant et après la transaction A sont incohérents. Ce problème est appelé la lecture non répétée (ne peut pas être lu à plusieurs reprises). (Les enregistrements se lisent de manière incohérente entre les deux fois, et les lectures répétées trouveront des problèmes.)
En plus du problème de lecture non répréhensible, READ_COMMITTED peut également avoir un problème de lecture fantôme.
Repeatable_read signifie qu'une transaction peut lire un enregistrement à partir de la base de données plusieurs fois, et l'enregistrement se lit plusieurs fois est le même, identique. Ce niveau d'isolement peut éviter le problème de la lecture sale et de la lecture non répréhensible, mais le problème de la lecture fantôme peut se produire. Comme indiqué dans la figure ci-dessous.
La transaction A lit une série d'enregistrements de la base de données deux fois, au cours de laquelle la transaction B insère un enregistrement et la soumet. Lorsque la transaction A lit la deuxième fois, l'enregistrement que la transaction B vient d'être inséré sera lue. Au cours d'une transaction, une série d'enregistrements lues par transaction un deux fois est incohérente, et ce problème est appelé Phantom Read.
La sérialisable est le niveau d'isolement le plus fort de Spring. Lorsqu'une transaction est exécutée, elle sera verrouillée à tous les niveaux, comme lors de la lecture et de l'écriture, comme si la transaction était effectuée de manière série, plutôt que de se produire ensemble. Cela empêche la lecture sale, la lecture non répétée et la lecture fantôme, mais cela entraînera une dégradation des performances.
MySQL par défaut à REPEATABLE_READ .
Regardons un exemple ci-dessous. Ouvrez une transaction dans la base de données MySQL et ne vous engagez pas. Ensuite, une autre transaction lit l'enregistrement.
Au début, les enregistrements dans la base de données sont tels que indiqués sur la figure
Ensuite, ouvrez la transaction A dans la base de données MySQL et insérez un enregistrement.
L'attribut de transaction de la classe de service dans le service est configuré comme READ_UNCOMMITTED .
@Transactional (isolation = isolation.read_uncomMit) public class compttifervice {private actedao actedao; public accountdao getAccountDao () {return comptedy {accountdao.outmoney (de, monnaie); accountdao.inmoney (à, monnaie);} public void readAlLuser () {list <compte> accouts = accountdao.getAllUser (); pour (compte compte: comptes) {System.out.println (compte);}}}Exécutez la classe de test suivante
package com.chris.service; import static org.junit.assert. *; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.test.Context.contextConfiguration; import org.springframework.test.context.junit4 {comptactevice.readalluser ();}}Les résultats sont les suivants:
On peut voir que cette transaction lit des données non engagées.
À l'heure actuelle, reculez la transaction ouverte dans MySQL.
MySQL> Rollback;
Exécutez à nouveau le programme et le résultat est
Compte [nom = Michael, Money = 1000.0]
Compte [name = Jane, Money = 1000.0]
Compte [nom = Kate, monnaie = 1000.0]
Ce qui précède est tout le contenu de cet article sur l'introduction au niveau d'isolement des transactions de printemps et l'analyse des exemples. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!