Jedis Transactions
Quando usamos o JDBC para conectar -se ao MySQL, precisamos iniciar a transação antes de executar a instrução SQL; Em Mybatis, também precisamos usar o OpenSession () para obter o objeto de transação de sessão para executar a execução, consulta e outras operações do SQL. Quando nossa operação no banco de dados termina, o objeto de transação é responsável pelo fechamento da conexão do banco de dados.
Os objetos de transação são usados para gerenciar e executar várias operações de banco de dados. Ele pode ativar e fechar conexões de banco de dados, executar instruções SQL e reverter as operações de erro.
Nossos Redis também possuem objetos de gerenciamento de transações, localizados em redis.clients.jedis.transaction.
Código relacionado para transações JEDIS:
pacote cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; classe pública test7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transação transação = jedis.multi (); // retorna um objeto de controle de transação // pré -carregue a operação a ser executada no objeto de transação transaction.set ("k4", "v4"); transaction.set ("k5", "v5"); transaction.exec (); // execute}}Vamos conferir Redis:
Descobriram que os dados foram adicionados
Mudamos o valor de K4 e o valor de K5 para "V44" e "V55" e adicione a instrução transaction.discard () após a instrução transaction.exec ():
pacote cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; classe pública test7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transação transação = jedis.multi (); // retorna um objeto de controle de transação // pré -carregue a operação a ser executada no objeto de transação transaction.set ("k4", "v44"); transaction.set ("k5", "v55"); transaction.discard (); // rolling back}}Você descobrirá que a operação de inserção de dados é revertida e os dois valores em redis não foram alterados:
Simulamos uma transação que passa um cartão de crédito uma vez, usando transações Redis para lidar com alguma lógica:
pacote cn.com.redis; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; classe pública testTransaction {// simular o consumo e reembolso do cartão de crédito public estático void main (string [] args) {testTransaction t = new testTransaction (); Retvalue booleano = T.Transmethod (100); if (retvalue) {System.out.println ("Uso bem -sucedido do consumo de cartão de crédito!"); } else {System.out.println ("Falha ao usar o consumo de cartão de crédito!"); }} /*** Nos termos do Layman, o comando Watch é marcar uma chave. Se uma chave estiver marcada, * se a chave for modificada por outra pessoa antes de enviar a transação, a transação falhará. Essa situação geralmente pode ser tentada novamente no programa*. * * Primeiro, marque o saldo e verifique se o saldo é suficiente. Se for insuficiente, cancele a marca sem dedução; * Se for suficiente, inicie a transação para operação de atualização. * Se o saldo -chave for modificado por outros durante esse período, será relatado um erro ao enviar a transação (EXEC). * Esse tipo de erro geralmente pode ser capturado no programa e executado novamente até que seja bem -sucedido. * */ Private boolean transmethod (INT valor) {System.out.println ("Você usa cartão de crédito para avançar o pagamento"+valor+"yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balaça = 1000; // BALANÇO DISPONÍVEL Int dívida; // de int amttosubtract = vale; // valor de escovação real jedis.set ("balance", string.valueof (balanço)); Jedis.watch ("Balance"); //jedis.set("balance "," 1100 "); // Esta frase não deve aparecer. Para simular outros programas, a entrada foi modificada. Balance = Integer.parseint (Jedis.get ("Balance")); if (balanço <amttosubtract) {// O saldo disponível é menor que a quantidade real escovada, a transação é recusada jedis.unwatch (); System.out.println ("O saldo disponível é insuficiente!"); retornar falso; } else {// Quando o saldo disponível é suficiente, execute o sistema de dedução operação.out.println ("A transação de dedução inicia a execução ..."); Transação transaction = jedis.multi (); transaction.decrby ("balance", amttosubtract); // balance menos a quantidade de dinheiro em amttosubtract transaction.incrby ("dívida", amttosubtract); // dívida de cartão de crédito aumenta o valor do balanço do dinheiro na amTToSubtrate. dívida = integer.parseint (jedis.get ("dívida")); System.out.println ("Execução da transação de dívida final ..."); System.out.println ("Seu saldo disponível:"+Balance); System.out.println ("Você deve dinheiro atualmente:"+dívida); retornar true; }}}Este código simula o usuário que usou um cartão de crédito para deslizar 100 yuan. No momento, o saldo disponível do cartão de crédito deve ser reduzido em 100 yuans, e a dívida de 100 yuans deve ser aumentada.
Resultados em execução:
Resultados de Redis:
Prove que nossa operação foi bem -sucedida.
O comando Watch é adicionado para impedir que outras operações interrompem as transações ou afetem os resultados do cálculo da transação durante a execução da transação, resultando em situações anormais como "Leitura de Ilusão" e "Dados Dirty". O comando Watch cria uma chave. Uma vez constatado que a chave foi modificada por outra pessoa durante a execução, a transação falhará. Esse tipo de erro geralmente pode ser capturado no programa e depois executado novamente até que seja bem -sucedido. Portanto, o comando Watch pode garantir a sincronização dos dados.
Para provar o objetivo do comando Watch, lançamos o Jedis.Set ("Balance", "1100"); Comente no código acima e, em seguida, o método transmethod lança a exceção interrompida: lança interruptedException, o método principal captura a exceção interrompida e, em seguida, uma caixa de aviso correspondente aparece.
pacote cn.com.redis; importar java.util.list; importar redis.clients.jedis.jedis; importar redis.clients.jedis.transaction; classe pública testTransaction {// simular o consumo e reembolso do cartão de crédito public estático void main (string [] args) {testTransaction t = new testTransaction (); Retvalue booleano = false; interrompido booleano = false; tente {retValue = t.transmethod (100); } catch (interruptedException e) {interromped = true; System.out.println ("A transação é interrompida, execute novamente!"); } finalmente {if (retValue) {System.out.println ("Uso bem -sucedido do cartão de crédito!"); } else {if (! interrompido) {System.out.println ("Falha ao usar o cartão de crédito! Equilíbrio insuficiente!"); }}}}} /*** Em termos simples, o comando Watch é marcar uma chave. Se uma chave estiver marcada, * se a chave for modificada por outra pessoa antes de enviar a transação, a transação falhará. Essa situação geralmente pode ser tentada novamente no programa*. * * Primeiro, marque o saldo e verifique se o saldo é suficiente. Se for insuficiente, cancele a marca sem dedução; * Se for suficiente, inicie a transação para operação de atualização. * Se o saldo -chave for modificado por outros durante esse período, será relatado um erro ao enviar a transação (EXEC). * Esse tipo de erro geralmente pode ser capturado no programa e executado novamente até que seja bem -sucedido. * */ BOOLEAN PRIVADO transmethod (INT) lança interruptedException {System.out.println ("Você usa seu cartão de crédito para avançar o pagamento"+valor+"yuan"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); int balaça = 1000; // BALANÇO DISPONÍVEL Int dívida; // valor absoluto int amttosubtract = valor; // limite de pincel real jedis.set ("balance", string.valueof (balanço)); Jedis.watch ("Balance"); Jedis.set ("Balance", "1100"); // Esta frase não deve aparecer. Para simular outros programas, a entrada foi modificada. Balance = Integer.parseint (Jedis.get ("Balance")); if (balanço <amttosubtract) {// O saldo disponível é menor que a quantidade real escovada, a transação é recusada jedis.unwatch (); System.out.println ("O saldo disponível é insuficiente!"); retornar falso; } else {// Quando o saldo disponível é suficiente, execute o sistema de dedução operação.out.println ("A transação de dedução inicia a execução ..."); Transação transaction = jedis.multi (); transaction.decrby ("balance", amttosubtract); // o saldo menos o dinheiro da amttosubtract transaction.incrby ("dívida", amttosubtract); // a dívida do cartão de crédito aumenta a transação da executura se (lista de substatir) (resultar), resulta (transação); modificado durante o sistema de execução. lançar new interruptedException (); } else {// o envio de transação bem -sucedido Balance = Integer.parseint (jedis.get ("balanço")); dívida = integer.parseint (jedis.get ("dívida")); System.out.println ("Execução de transação de dedução final ..."); System.out.println ("Seu saldo disponível:"+Balance); System.out.println ("Você deve dinheiro atualmente:"+dívida); retornar true; }}}}}Execute novamente e veja o efeito:
Isso mostra que, se os dados forem modificados após a execução do comando Watch e antes da transação ser enviada, a execução da transação não será bem -sucedida, o que garante a segurança dos dados.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.