Transacciones JEDIS
Cuando usamos JDBC para conectarnos a MySQL, debemos iniciar la transacción antes de ejecutar la instrucción SQL; En MyBatis, también necesitamos usar OpenSession () para obtener el objeto de transacción de sesión para realizar la ejecución de SQL, consulta y otras operaciones. Cuando nuestra operación en la base de datos termina, el objeto de transacción es responsable de cerrar la conexión de la base de datos.
Los objetos de transacción se utilizan para administrar y realizar varias operaciones de bases de datos. Puede activarse y cerrar las conexiones de la base de datos, ejecutar declaraciones SQL y volver a las operaciones de error.
Nuestro Redis también tiene objetos de gestión de transacciones, que se encuentran en redis.clients.jedis.transaction.
Código relacionado para las transacciones JEDIS:
paquete cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; Public Class Test7 {public static void main (String [] args) {jEdis jEdis = new JEdis ("192.168.248.129", 6379); Transacción transacción = jedis.multi (); // return un objeto de control de transacciones // precarga la operación que se ejecutará en el objeto de transacción por adelantado Transaction.set ("k4", "v4"); transaccion.set ("k5", "v5"); transacción.exec (); // ejecutar}}Veamos a Redis:
Descubrió que los datos se han agregado
Cambiamos el valor de K4 y el valor de K5 a "V44" y "V55", y luego agregamos la instrucción Transaction.Discard () después de la instrucción Transaction.Exec ()::
paquete cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; Public Class Test7 {public static void main (String [] args) {jEdis jEdis = new JEdis ("192.168.248.129", 6379); Transacción transacción = jedis.multi (); // return un objeto de control de transacciones // precarga la operación que se ejecutará en el objeto de transacción por adelantado Transaction.set ("k4", "v44"); transacción.set ("K5", "V55"); transaccion.discard (); // rodando}}Encontrará que la operación de inserción de datos se retrocede y los dos valores en Redis no han cambiado:
Simulamos una transacción que desliza una tarjeta de crédito una vez, utilizando las transacciones Redis para manejar alguna lógica:
paquete cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; Public Class TestTransaction {// Simular el consumo y el reembolso de la tarjeta de crédito y el público void estático (String [] args) {testTransaction t = new testTransaction (); boolean retvalue = t.transmethod (100); if (retvalue) {system.out.println ("¡Uso exitoso del consumo de tarjeta de crédito!"); } else {System.out.println ("¡No se pudo usar del consumo de tarjeta de crédito!"); }} /*** En términos de Layman, el comando Watch es marcar una clave. Si se marca una clave, * si la clave es modificada por otra persona antes de enviar la transacción, la transacción fallará. Esta situación generalmente se puede intentar nuevamente en el programa*. * * Primero, marque el saldo y luego verifique si el saldo es suficiente. Si es insuficiente, cancele la marca sin deducción; * Si es suficiente, inicie la transacción para la operación de actualización. * Si los otros modifican el saldo clave durante este período, se informará un error al enviar la transacción (EXEC). * Este tipo de error generalmente se puede atrapar en el programa y luego ejecutarse nuevamente hasta que tenga éxito. * */ private boolean transmethod (int monta) {system.out.println ("Utiliza la tarjeta de crédito para avanzar en el pago"+monto+"yuan"); JEDIS JEDIS = new Jedis ("192.168.248.129", 6379); int balance = 1000; // Balance disponible int jedis.watch ("Balance"); //jedis.set("balance "," 1100 "); // Esta oración no debería aparecer. Para simular otros programas, la entrada ha sido modificada. balance = Integer.ParseInt (jedis.get ("balance")); if (balance <amtToSubtract) {// El saldo disponible es menor que la cantidad cepillada real, la transacción se niega jedis.unwatch (); System.out.println ("El saldo disponible es insuficiente!"); devolver falso; } else {// Cuando el saldo disponible es suficiente, ejecute la operación de deducción System.out.println ("La transacción de deducción inicia la ejecución ..."); Transacción transacción = jedis.multi (); transaccion.Decrby ("saldo", amtToSubtract); // saldo menos la cantidad de dinero en amtToSubtract transaccion.incrby ("deuda", amtToSubtract); // La deuda de la tarjeta de crédito aumenta la cantidad de dinero en amtTosubtract.Exec (); // ejecutar el balance de transacción = integer.parseint (jedis.get ("balance"));));); deuda = Integer.ParseInt (jedis.get ("deuda")); System.out.println ("Ejecución de ejecución de transacciones de transacción de deuda ..."); System.out.println ("Su saldo disponible:"+balance); System.out.println ("Actualmente le debe dinero:"+deuda); devolver verdadero; }}}Este código simula al usuario que usó una tarjeta de crédito para deslizar 100 yuanes. En este momento, el saldo disponible de la tarjeta de crédito debe reducirse en 100 yuanes, y se debe aumentar la deuda de 100 yuanes.
Resultados de ejecución:
Resultados de Redis:
Demuestre que nuestra operación fue exitosa.
El comando de reloj se agrega para evitar que otras operaciones interrumpan las transacciones o afecten los resultados de cálculo de la transacción durante la ejecución de la transacción, lo que resulta en situaciones anormales como "lectura de ilusión" y "datos sucios". El comando de reloj crea una clave. Una vez que se encuentra que la clave ha sido modificada por otra persona durante la ejecución, la transacción fallará. Este tipo de error generalmente se puede atrapar en el programa y luego ejecutarse nuevamente hasta que sea exitoso. Por lo tanto, el comando de reloj puede garantizar la sincronización de datos.
Para demostrar el propósito del comando de reloj, lanzamos el jedis.set ("Balance", "1100"); Comente en el código anterior, y luego el método Transmetod lanza la excepción interrumpida: lanza interruptedException, el método principal atrapa la excepción interrumpida y luego aparece un cuadro de advertencia correspondiente.
paquete cn.com.redis; import java.util.list; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; Public Class TestTransaction {// Simular el consumo y el reembolso de la tarjeta de crédito y el público void estático (String [] args) {testTransaction t = new testTransaction (); boolean retvalue = false; booleano interrumpido = falso; intente {retvalue = t.transmethod (100); } capt (interruptedException e) {interrupted = true; System.out.println ("La transacción se interrumpe, ¡ejecute nuevamente!"); } Finalmente {if (retvalue) {System.out.println ("¡Uso exitoso de la tarjeta de crédito!"); } else {if (! Interrupted) {System.out.println ("¡No se pudo usar con tarjeta de crédito! ¡Saldo insuficiente!"); }}}}} /*** En términos simples, el comando de reloj es marcar una clave. Si se marca una clave, * si la clave es modificada por otra persona antes de enviar la transacción, la transacción fallará. Esta situación generalmente se puede intentar nuevamente en el programa*. * * Primero, marque el saldo y luego verifique si el saldo es suficiente. Si es insuficiente, cancele la marca sin deducción; * Si es suficiente, inicie la transacción para la operación de actualización. * Si los otros modifican el saldo clave durante este período, se informará un error al enviar la transacción (EXEC). * Este tipo de error generalmente se puede atrapar en el programa y luego ejecutarse nuevamente hasta que tenga éxito. * */ private boolean transmethod (int monta) arroja interruptedException {system.out.println ("Utiliza su tarjeta de crédito para avanzar en el pago"+monto+"yuan"); JEDIS JEDIS = new Jedis ("192.168.248.129", 6379); int balance = 1000; // Balance disponible int jedis.watch ("Balance"); jedis.set ("Balance", "1100"); // Esta oración no debería aparecer. Para simular otros programas, la entrada ha sido modificada. balance = Integer.ParseInt (jedis.get ("balance")); if (balance <amtToSubtract) {// El saldo disponible es menor que la cantidad cepillada real, la transacción se niega jedis.unwatch (); System.out.println ("El saldo disponible es insuficiente!"); devolver falso; } else {// Cuando el saldo disponible es suficiente, ejecute la operación de deducción System.out.println ("La transacción de deducción inicia la ejecución ..."); Transacción transacción = jedis.multi (); transaccion.Decrby ("Balance", amtToSubtract); // El saldo menos el dinero de AmtToSubtract transaction.incrby ("deuda", amtToSubtract); // La deuda de la tarjeta de crédito aumenta el dinero de amtToSubtract LIST <Object> result = transaccion.exec (); // La ejecución de la transacción if (resultado == null) {// the/the the object> date = transaction.exec (); // La ejecución de transacciones if (resultado == null) {// the/the the object> surcact.exec (); // la ejecución de transacciones if (resultado == null) {// the/the la transacción = transacción.exec (); modificado durante el sistema de ejecución.out.println ("deducir la interrupción de la ejecución de la transacción ..."); tirar nueva interrupciónxception (); } else {// el balance exitoso de envío de transacción = integer.parseInt (jedis.get ("balance")); deuda = Integer.ParseInt (jedis.get ("deuda")); System.out.println ("deducir la ejecución de la transacción final ..."); System.out.println ("Su saldo disponible:"+balance); System.out.println ("Actualmente le debe dinero:"+deuda); devolver verdadero; }}}}}Ejecutarlo de nuevo y ver el efecto:
Esto muestra que si los datos se modifican después de ejecutar el comando de reloj y antes de que se envíe la transacción, la ejecución de la transacción no tendrá éxito, lo que garantiza la seguridad de los datos.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.