Jedis -Transaktionen
Wenn wir JDBC verwenden, um eine Verbindung zu MySQL herzustellen, müssen wir die Transaktion starten, bevor wir die SQL -Anweisung ausführen. In MyBatis müssen wir auch OpenSession () verwenden, um das Session -Transaktions -Objekt zu erhalten, um SQL -Ausführung, Abfrage und andere Operationen durchzuführen. Wenn unser Betrieb in der Datenbank beendet ist, ist das Transaktionsobjekt für das Schließen der Datenbankverbindung verantwortlich.
Transaktionsobjekte werden verwendet, um verschiedene Datenbankvorgänge zu verwalten und auszuführen. Es kann Datenbankverbindungen einschalten und schließen, SQL -Anweisungen ausführen und Fehlervorgänge zurückführen.
Unser Redis verfügt auch über Transaktionsmanagementobjekte, die sich unter redis.clients.jedis.transaction befinden.
Verwandter Code für JEDIS -Transaktionen:
Paket cn.com.redis; Import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; public class test7 {public static void main (String [] args) {jedis jedis = new Jedis ("192.168.248.129", 6379); Transaktionstransaktion = jedis.multi (); // Rückgabe eines Transaktionskontrollobjekts // Vorladung des Vorgangs, der in dem Transaktionsobjekt im Voraus Transaktion ausgeführt werden soll. Transaction.set ("K5", "v5"); Transaction.exec (); // execute}}Schauen wir uns Redis an:
Fanden heraus, dass die Daten hinzugefügt wurden
Wir ändern den Wert von K4 und den Wert von K5 auf "v44" und "v55" und fügen dann die Transaktion hinzu.
Paket cn.com.redis; Import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; public class test7 {public static void main (String [] args) {jedis jedis = new Jedis ("192.168.248.129", 6379); Transaktionstransaktion = jedis.multi (); // Rückgabe eines Transaktionskontrollobjekts // Vorladung des Vorgangs, der im Transaktionsobjekt im Voraus transaktion ausgeführt werden soll ("K4", "v44"); Transaction.set ("K5", "v55"); Transaction.discard (); // Zurückrollen}}Sie werden feststellen, dass der Dateneinfügungsvorgang zurückgerollt ist und die beiden Werte in Redis nicht geändert wurden:
Wir simulieren eine Transaktion, die einmal eine Kreditkarte wischt, wobei REDIS -Transaktionen verwendet werden, um eine Logik zu verarbeiten:
Paket cn.com.redis; Import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; public class testtransaction {// Simulation von Kreditkartenverbrauch und Rückzahlung public static void main (String [] args) {testTransaction t = new TestTransaction (); boolean retValue = t.transmethod (100); if (retValue) {System.out.println ("erfolgreiche Verwendung des Kreditkartenverbrauchs!"); } else {System.out.println ("Die Verwendung des Kreditkartenverbrauchs nicht verwendet!"); }} /*** In Layman's Terms soll der Watch -Befehl einen Schlüssel markieren. Wenn ein Schlüssel markiert ist, *, wenn der Schlüssel vor der Übermittlung der Transaktion von einer anderen Person geändert wird, schließt die Transaktion fehl. Diese Situation kann normalerweise im Programm*erneut versucht werden. * * Markieren Sie zuerst das Gleichgewicht und prüfen Sie dann, ob der Restbetrag ausreicht. Wenn es nicht ausreicht, stornieren Sie die Marke ohne Abzug. * Wenn es ausreicht, starten Sie die Transaktion für den Aktualisierungsvorgang. * Wenn der Schlüsselbilanz während dieses Zeitraums von anderen geändert wird, wird bei der Übermittlung der Transaktion (EXEC) ein Fehler gemeldet. * Diese Art von Fehler kann normalerweise im Programm gefangen und dann erneut ausgeführt werden, bis er erfolgreich ist. * */ private boolean transmethod (int betret) {System.out.println ("Sie verwenden Kreditkarte, um die Zahlung voranzutreiben"+Betrag+"yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balance = 1000; // verfügbare Saldo int -Schulden; // Aus int AMTTOSUBRACT = Betrag; // realer Bürstenbetrag Jedis.set ("Saldo", String.Valueof (Saldo)); Jedis.Watch ("Balance"); //jedis.set("Balance "," 1100 "); // Dieser Satz sollte nicht erscheinen. Um andere Programme zu simulieren, wurde der Eintrag geändert. Balance = Integer.ParseInt (jedis.get ("Balance")); if (balance <amttoSubtract) {// Der verfügbare Gleichgewicht ist geringer als der tatsächliche gebürstete Betrag, der Transaktion wird jedis.unwatch () abgelehnt; System.out.println ("Die verfügbare Balance ist unzureichend!"); false zurückgeben; } else {// Wenn der verfügbare Restbetrag ausreicht, führen Sie dann das Abzugsoperationssystem.out.println aus ("Die Abzugstransaktion startet die Ausführung ..."); Transaktionstransaktion = jedis.multi (); Transaction.Decrby ("Balance", AmttoSubtract); // Balance abzüglich des Geldbetrags in AmttoSubtract Transaction.incrby ("Schulden", AmtToSubtract); // Kreditkartenschulden erhöht den Geldbetrag in AMTTOsubract.exec (); // Execute Transaction Balance = Intereger.Parseint (Jedis.Ge.Ge.Ge.Ge. ")). schulden = integer.parseInt (jedis.get ("schulden")); System.out.println ("Schuldentransaktionsausführung End ..."); System.out.println ("Ihr verfügbares Gleichgewicht:"+Balance); System.out.println ("Sie schulden derzeit Geld:"+Schuld); zurückkehren; }}}Dieser Code simuliert den Benutzer, der eine Kreditkarte verwendet hat, um 100 Yuan zu wischen. Zu diesem Zeitpunkt sollte der verfügbare Guthaben der Kreditkarte um 100 Yuan reduziert werden, und die Schulden von 100 Yuan sollte erhöht werden.
Auslaufergebnisse:
Redis -Ergebnisse:
Beweisen, dass unsere Operation erfolgreich war.
Der Watch -Befehl wird hinzugefügt, um zu verhindern, dass andere Operationen Transaktionen unterbrechen oder die Berechnungsergebnisse der Transaktion während der Transaktionsausführung beeinflussen, was zu abnormalen Situationen wie "Illusions -Lesen" und "schmutzigen Daten" führt. Der Befehl Watch erstellt einen Schlüssel. Sobald festgestellt wurde, dass der Schlüssel während der Ausführung von jemand anderem geändert wurde, wird die Transaktion fehlschlagen. Diese Art von Fehler kann normalerweise im Programm gefangen und dann erneut ausgeführt werden, bis er erfolgreich ist. Daher kann der Beobachtungsbefehl die Synchronisation von Daten sicherstellen.
Um den Zweck des Watch -Befehls zu beweisen, veröffentlichen wir den Jedis.set ("Balance", "1100"); Kommentar im obigen Code, und dann löst die Transmethod -Methode die unterbrochene Ausnahme aus: wirft die InterruptedException aus, die Hauptmethode fängt die unterbrochene Ausnahme ein und dann taucht ein entsprechendes Warnbox auf.
Paket cn.com.redis; importieren java.util.list; Import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; public class testtransaction {// Simulation von Kreditkartenverbrauch und Rückzahlung public static void main (String [] args) {testTransaction t = new TestTransaction (); boolescher RetValue = False; boolean unterbrochen = falsch; try {retValue = t.transMethod (100); } catch (InterruptedException e) {interbrupted = true; System.out.println ("Die Transaktion wird unterbrochen, bitte noch einmal ausführen!"); } endlich {if (retValue) {System.out.println ("erfolgreiche Verwendung von Kreditkarte!"); } else {if (! Interrupted) {System.out.println ("Die Verwendung von Kreditkarte nicht verwendet! }}}}} /*** In einfachen Worten soll der Watch -Befehl einen Schlüssel markieren. Wenn ein Schlüssel markiert ist, *, wenn der Schlüssel vor der Übermittlung der Transaktion von einer anderen Person geändert wird, schließt die Transaktion fehl. Diese Situation kann normalerweise im Programm*erneut versucht werden. * * Markieren Sie zuerst das Gleichgewicht und prüfen Sie dann, ob der Restbetrag ausreicht. Wenn es nicht ausreicht, stornieren Sie die Marke ohne Abzug. * Wenn es ausreicht, starten Sie die Transaktion für den Aktualisierungsvorgang. * Wenn der Schlüsselbilanz während dieses Zeitraums von anderen geändert wird, wird bei der Übermittlung der Transaktion (EXEC) ein Fehler gemeldet. * Diese Art von Fehler kann normalerweise im Programm gefangen und dann erneut ausgeführt werden, bis er erfolgreich ist. * */ private boolean transmethod (int älter) löscht InterruptedException {System.out.println aus ("Sie verwenden Ihre Kreditkarte, um die Zahlung zu verbessern"+Betrag+"Yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balance = 1000; // verfügbare Saldo int -Schulden; // absoluter Betrag int AmtToSubtract = Betrag; // Real Brush Limit Jedis.set ("Saldo", String.ValueOf (Saldo)); Jedis.Watch ("Balance"); Jedis.set ("Balance", "1100"); // Dieser Satz sollte nicht erscheinen. Um andere Programme zu simulieren, wurde der Eintrag geändert. Balance = Integer.ParseInt (jedis.get ("Balance")); if (balance <amttoSubtract) {// Der verfügbare Gleichgewicht ist geringer als der tatsächliche gebürstete Betrag, der Transaktion wird jedis.unwatch () abgelehnt; System.out.println ("Die verfügbare Balance ist unzureichend!"); false zurückgeben; } else {// Wenn der verfügbare Restbetrag ausreicht, führen Sie dann das Abzugsoperationssystem.out.println aus ("Die Abzugstransaktion startet die Ausführung ..."); Transaktionstransaktion = jedis.multi (); Transaction.Decrby ("Balance", AmttoSubtract); // Das Gleichgewicht abzüglich des Geldes von AmttoSubtract Transaction.incrby ("Schulden", AmtToSubtract); // Die Kreditkartenschulden erhöht das Geld von AmtToSubraction -Liste <objekt>. geändert während der Ausführung System.out.println ("Transaktionsausführung Interrupt ..."); neue InterruptedException () werfen; } else {// Die Transaktionsübermittlung erfolgreich Balance = Integer.ParseInt (jedis.get ("Balance")); schulden = integer.parseInt (jedis.get ("schulden")); System.out.println ("Transaktionsausführung End ..."); System.out.println ("Ihr verfügbares Gleichgewicht:"+Balance); System.out.println ("Sie schulden derzeit Geld:"+Schuld); zurückkehren; }}}}}Führen Sie es erneut aus und sehen Sie den Effekt an:
Dies zeigt, dass die Transaktionsausführung nicht erfolgreich ist, wenn die Daten nach der Ausführung des Watch -Befehls geändert werden und bevor die Transaktion eingereicht wird, die Sicherheit der Daten gewährleistet.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.