Transactions Jedis
Lorsque nous utilisons JDBC pour nous connecter à MySQL, nous devons démarrer la transaction avant d'exécuter l'instruction SQL; Dans MyBatis, nous devons également utiliser OpenSession () pour obtenir l'objet de transaction de session pour effectuer l'exécution SQL, la requête et d'autres opérations. Lorsque notre opération dans la base de données est terminée, l'objet de transaction est responsable de la fermeture de la connexion de la base de données.
Les objets de transaction sont utilisés pour gérer et effectuer diverses opérations de base de données. Il peut activer et fermer les connexions de la base de données, exécuter les instructions SQL et faire reculer les opérations d'erreur.
Notre Redis dispose également d'objets de gestion des transactions, qui sont situés sous redis.clients.jedis.transaction.
Code connexe pour les transactions Jedis:
Package CN.com.redis; Importer redis.clients.jedis.Jedis; Importer redis.clients.jedis.transaction; classe publique test7 {public static void main (String [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transaction Transaction = Jedis.Multi (); // Renvoie un objet de contrôle de transaction // Précharge de l'opération à exécuter dans l'objet de transaction dans Advance Transaction.set ("K4", "V4"); transaction.set ("k5", "v5"); transaction.exec (); // exécuter}}Voyons Redis:
Ont constaté que les données ont été ajoutées
Nous modifions la valeur de K4 et la valeur de K5 en "V44" et "V55", puis ajoutant l'instruction transaction.discard () après l'instruction transaction.exec ():
Package CN.com.redis; Importer redis.clients.jedis.Jedis; Importer redis.clients.jedis.transaction; classe publique test7 {public static void main (String [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transaction transaction = jedis.multi (); // renvoie un objet de contrôle de transaction // précharge l'opération à exécuter dans l'objet de transaction à l'avance transaction.set ("k4", "v44"); transaction.set ("k5", "v55"); transaction.discard (); // Rolling Back}}Vous constaterez que l'opération d'insertion de données est annulée et que les deux valeurs de Redis n'ont pas été modifiées:
Nous simulons une transaction qui glisse une carte de crédit une fois, en utilisant les transactions Redis pour gérer une logique:
Package CN.com.redis; Importer redis.clients.jedis.Jedis; Importer redis.clients.jedis.transaction; classe publique TestTransaction {// Simuler la consommation de cartes de crédit et le remboursement public static void main (String [] args) {testTransaction t = new TestTransaction (); booléen retvalue = t.transmethod (100); if (retValue) {System.out.println ("Utilisation réussie de la consommation de cartes de crédit!"); } else {System.out.println ("Échec de l'utilisation de la consommation de cartes de crédit!"); }} / ** * En termes de laïque, la commande de montre est de marquer une clé. Si une clé est marquée, * Si la clé est modifiée par quelqu'un d'autre avant de soumettre la transaction, la transaction échouera. Cette situation peut généralement être réessayée dans le programme *. * * Tout d'abord, marquez le solde, puis vérifiez si le solde est suffisant. S'il est insuffisant, annulez la marque sans déduction; * Si cela suffit, démarrez la transaction pour le fonctionnement de mise à jour. * Si le solde des clés est modifié par d'autres au cours de cette période, une erreur sera signalée lors de la soumission de la transaction (EXEC). * Ce type d'erreur peut généralement être pris dans le programme, puis exécuté à nouveau jusqu'à ce qu'il soit réussi. * * / Private Boolean TransMethod (INT MUTL) {System.out.println ("Vous utilisez la carte de crédit pour faire avancer le paiement" + montant + "Yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balance = 1000; // Balance disponible de la dette int; // sur int amttosubstract = montant; // réel brossage du montant jedis.set ("bilan", string.valueof (balance)); Jedis.Watch ("Balance"); //Jedis.set("balance "," 1100 "); // cette phrase ne devrait pas apparaître. Afin de simuler d'autres programmes, l'entrée a été modifiée. Balance = Integer.ParseInt (Jedis.get ("Balance")); if (Balance <amTtoSubstract) {// Le solde disponible est inférieur au montant réel brossé, la transaction est refusée jedis.unwatch (); System.out.println ("Le solde disponible est insuffisant!"); retourne false; } else {// Lorsque le solde disponible est suffisant, exécutez le Système de l'opération de déduction.out.println ("La transaction de déduction démarre l'exécution ..."); Transaction transaction = jedis.multi (); Transaction.Decrby ("Balance", AmttoSubtract); // Balance moins le montant d'argent dans AMTTOSUBRAT TRANSACTION.incrby ("Debt", Amttosubtract); // La dette de carte de crédit augmente le montant de l'argent dans Amttosubtract Transaction.Exec ("Balance"); Debt = Integer.ParseInt (Jedis.get ("Debt")); System.out.println ("Debt Transaction Exécution End ..."); System.out.println ("Votre solde disponible:" + Balance); System.out.println ("Vous devez actuellement de l'argent:" + dette); Retour Vrai; }}}Ce code simule l'utilisateur qui a utilisé une carte de crédit pour glisser 100 yuans. À l'heure actuelle, le solde disponible de la carte de crédit doit être réduit de 100 yuans et la dette de 100 yuans doit être augmentée.
Résultats en cours:
Résultats redis:
Prouvez que notre opération a réussi.
La commande de montre est ajoutée pour empêcher d'autres opérations d'interrompre les transactions ou d'affecter les résultats de calcul de la transaction lors de l'exécution des transactions, ce qui entraîne des situations anormales telles que la "lecture d'illusion" et "Dirty Data". La commande de montre crée une clé. Une fois qu'il est constaté que la clé a été modifiée par quelqu'un d'autre pendant l'exécution, la transaction échouera. Ce type d'erreur peut généralement être pris dans le programme, puis exécuté à nouveau jusqu'à ce qu'il soit réussi. Par conséquent, la commande de montre peut assurer la synchronisation des données.
Afin de prouver l'objectif de la commande de montre, nous libérons le Jedis.set ("Balance", "1100"); Commentaire dans le code ci-dessus, puis la méthode TransMethod lance l'exception interrompue: lève l'interruption, la méthode principale attrape l'exception interrompue, puis une boîte d'alerte correspondante apparaît.
Package CN.com.redis; Importer java.util.list; Importer redis.clients.jedis.Jedis; Importer redis.clients.jedis.transaction; classe publique TestTransaction {// Simuler la consommation de cartes de crédit et le remboursement public static void main (String [] args) {testTransaction t = new TestTransaction (); booléen retValue = false; booléen interrompu = false; essayez {retValue = T.TransMethod (100); } catch (InterruptedException e) {interrupted = true; System.out.println ("La transaction est interrompue, veuillez exécuter à nouveau!"); } Enfin {if (retValue) {System.out.println ("Utilisation réussie de la carte de crédit!"); } else {if (! Interrupted) {System.out.println ("Échec de l'utilisation de la carte de crédit! Balance insuffisante!"); }}}}} / ** * En termes simples, la commande de montre est de marquer une clé. Si une clé est marquée, * Si la clé est modifiée par quelqu'un d'autre avant de soumettre la transaction, la transaction échouera. Cette situation peut généralement être réessayée dans le programme *. * * Tout d'abord, marquez le solde, puis vérifiez si le solde est suffisant. S'il est insuffisant, annulez la marque sans déduction; * Si cela suffit, démarrez la transaction pour le fonctionnement de mise à jour. * Si le solde des clés est modifié par d'autres au cours de cette période, une erreur sera signalée lors de la soumission de la transaction (EXEC). * Ce type d'erreur peut généralement être pris dans le programme, puis exécuté à nouveau jusqu'à ce qu'il soit réussi. * * / Private Boolean TransMethod (INT MUTL) lève InterruptedException {System.out.println ("Vous utilisez votre carte de crédit pour faire avancer le paiement" + montant + "yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balance = 1000; // Balance disponible dans la dette int; // montant absolu int amttoSubstract = montant; // réel limite de pinceau jedis.set ("bancaire", string.valueof (bancal)); Jedis.Watch ("Balance"); Jedis.set ("Balance", "1100"); // Cette phrase ne devrait pas apparaître. Afin de simuler d'autres programmes, l'entrée a été modifiée. Balance = Integer.ParseInt (Jedis.get ("Balance")); if (Balance <amTtoSubstract) {// Le solde disponible est inférieur au montant réel brossé, la transaction est refusée jedis.unwatch (); System.out.println ("Le solde disponible est insuffisant!"); retourne false; } else {// Lorsque le solde disponible est suffisant, exécutez le Système de l'opération de déduction.out.println ("La transaction de déduction démarre l'exécution ..."); Transaction transaction = jedis.multi (); transaction.decrby ("solde", amttosubstract); // le solde moins l'argent de la transaction Amttosubtract.incrby ("dette", Amttosubtract); System.out.println ("Interruption d'exécution des transactions de déduction ..."); Jetez une nouvelle interruption (); } else {// La soumission de transaction réussie Balance = Integer.ParseInt (Jedis.get ("Balance")); Debt = Integer.ParseInt (Jedis.get ("Debt")); System.out.println ("Déduire End Exécution de la transaction ..."); System.out.println ("Votre solde disponible:" + Balance); System.out.println ("Vous devez actuellement de l'argent:" + dette); Retour Vrai; }}}}}Exécutez-le à nouveau et voyez l'effet:
Cela montre que si les données sont modifiées après l'exécution de la commande de montre et avant la soumission de la transaction, l'exécution de la transaction ne réussira pas, ce qui garantit la sécurité des données.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.