Транзакции джедаи
Когда мы используем JDBC для подключения к MySQL, нам нужно запустить транзакцию перед выполнением оператора SQL; В Mybatis нам также необходимо использовать OpenSession () для получения объекта транзакции сеанса для выполнения выполнения SQL, запроса и других операций. Когда наша операция в базе данных закончится, объект транзакции отвечает за закрытие подключения к базе данных.
Объекты транзакции используются для управления и выполнения различных операций базы данных. Он может включать и закрывать подключения базы данных, выполнять операторы SQL и операции ошибок.
У нашего Redis также есть объекты управления транзакциями, которые расположены в Redis.clients.jedis.transaction.
Связанный код для транзакций Jedis:
Пакет cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; открытый тест класса7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Транзакция транзакции = jedis.multi (); // Возврат объекта управления транзакцией // Предварительная загрузка операции, которая будет выполнена в объекте транзакции. Transaction.Set ("k5", "v5"); transaction.exec (); // выполнить}}Посмотрим Redis:
Обнаружил, что данные были добавлены
Мы изменяем значение K4 и значение K5 на «V44» и «V55», а затем добавляем оператор Transaction.discard () после оператора Transaction.exec ():
Пакет cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; открытый тест класса7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Транзакция транзакции = jedis.multi (); // Возврат объекта управления транзакцией // Предварительная загрузка операции для выполнения в объекте транзакции. Transaction.Set ("k5", "v55"); transaction.discard (); // откачается}}Вы обнаружите, что операция вставки данных откатится, и два значения в Redis не были изменены:
Мы имитируем транзакцию, которая один раз ударяет кредитную карту, используя транзакции Redis для обработки логики:
Пакет cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; Общедоступный класс TestTransaction {// Моделировать потребление и погашение кредитной карты. логический реплект = t.transmethod (100); if (retvalue) {System.out.println («Успешное использование потребления кредитной карты!»); } else {System.out.println ("Не удалось использовать потребление кредитной карты!"); }} /*** В условиях мирян команда часов состоит в том, чтобы отметить ключ. Если ключ помечен, * если ключ изменен кем -то другим, прежде чем отправлять транзакцию, транзакция потерпит неудачу. Эта ситуация обычно можно попробовать снова в программе*. * * Сначала отметьте баланс, а затем проверьте, является ли баланс достаточным. Если это недостаточно, отмените отметку без вычета; * Если это достаточно, запустите транзакцию для операции обновления. * Если баланс ключа изменяется другими в течение этого периода, при отправке транзакции сообщается об ошибке. * Этот тип ошибки обычно может быть пойман в программе, а затем снова выполнен, пока она не станет успешной. * */ private Boolean Transmethod (int sumber) {System.out.println («Вы используете кредитную карту для авансового платежа»+Sutr+"yuan"); Jedis jedis = new jedis ("192.168.248.129", 6379); int balance = 1000; // Доступный баланс int dumb; // ut out int amttosubtract = summ; // реальная сумма чистки jedis.set ("balance", string.valueof (balance)); jedis.watch («баланс»); //jedis.set("balance "," 1100 "); // Это предложение не должно появляться. Чтобы имитировать другие программы, запись была изменена. баланс = integer.parseint (jedis.get ("balance")); if (баланс <amttosubtract) {// Доступный баланс меньше, чем фактическое матовое количество, транзакции отказывается от jedis.unwatch (); System.out.println («Доступный баланс недостаточен!»); вернуть ложь; } else {// Когда доступный баланс достаточно, затем выполните систему операции вычета. Транзакция транзакции = jedis.multi (); Transaction.decrby («Баланс», AmttoSubtract); // Баланс минус сумма денег в транзакции AmttoSubtract.incrby («долг», amttosubtract); // Задолженность по кредитной карте увеличивает сумму денег в amttosubtract sturnaction. долг = integer.parseint (jedis.get ("долг")); System.out.println ("Конец выполнения транзакции транзакции в долгах ..."); System.out.println («Ваш доступный баланс:»+баланс); System.out.println («Вы в настоящее время должны деньги:»+долг); вернуть истину; }}}Этот код имитирует пользователя, который использовал кредитную карту, чтобы провести 100 юаней. В настоящее время имеющийся баланс кредитной карты должен быть уменьшен на 100 юаней, а долг 100 юаней должен быть увеличен.
Результаты работы:
РЕДИС РЕЗУЛЬТАТЫ:
Докажите, что наша операция была успешной.
Команда часов добавляется, чтобы предотвратить прерывание других операций или повлиять на результаты расчета транзакции во время выполнения транзакции, что приводит к ненормальным ситуациям, таким как «чтение иллюзий» и «грязные данные». Команда часов создает ключ. Как только будет обнаружено, что ключ был изменен кем -то другим во время выполнения, транзакция потерпит неудачу. Этот тип ошибки обычно может быть пойман в программе, а затем снова выполнен, пока она не станет успешной. Следовательно, команда часов может обеспечить синхронизацию данных.
Чтобы доказать цель команды часов, мы отпускаем jedis.set («Баланс», «1100»); Комментарий в приведенном выше коде, а затем метод Transmethod бросает прерванное исключение: бросает прерывание, основной метод улавливает прерванное исключение, а затем появляется соответствующая предупреждающая коробка.
Пакет cn.com.redis; импортировать java.util.list; import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; Общедоступный класс TestTransaction {// Моделировать потребление и погашение кредитной карты. логический реплект = false; Boolean прерван = false; try {retvalue = t.transmethod (100); } catch (прерванная экспрессия e) {прерывание = true; System.out.println («Транзакция прерывается, пожалуйста, выполните снова!»); } наконец {if (retvalue) {System.out.println ("Успешное использование кредитной карты!"); } else {if (! прервано) {System.out.println ("Не удалось использовать кредитную карту! Недостаточный баланс!"); }}}}} /*** В простых терминах команда Watch - отметить ключ. Если ключ помечен, * если ключ изменен кем -то другим, прежде чем отправлять транзакцию, транзакция потерпит неудачу. Эта ситуация обычно можно попробовать снова в программе*. * * Сначала отметьте баланс, а затем проверьте, является ли баланс достаточным. Если это недостаточно, отмените отметку без вычета; * Если это достаточно, запустите транзакцию для операции обновления. * Если баланс ключа изменяется другими в течение этого периода, при отправке транзакции сообщается об ошибке. * Этот тип ошибки обычно может быть пойман в программе, а затем снова выполнен, пока она не станет успешной. * */ Private Boolean Transmethod (int Summ) Throws TreamptenException {System.out.println («Вы используете свою кредитную карту для авансового платежа»+Summent+"Yuan"); Jedis jedis = new jedis ("192.168.248.129", 6379); int balance = 1000; // Доступный баланс int dumb; // абсолютная сумма int amttosubtract = summ; // Реал щетки jedis.set ("balance", string.valueof (balance)); jedis.watch («баланс»); jedis.set («баланс», «1100»); // Это предложение не должно появляться. Чтобы имитировать другие программы, запись была изменена. баланс = integer.parseint (jedis.get ("balance")); if (баланс <amttosubtract) {// Доступный баланс меньше, чем фактическое матовое количество, транзакции отказывается от jedis.unwatch (); System.out.println («Доступный баланс недостаточен!»); вернуть ложь; } else {// Когда доступный баланс достаточно, затем выполните систему операции вычета. Транзакция транзакции = jedis.multi (); transaction.decrby («баланс», amttosubtract); // Баланс минус деньги на транзакцию amttosubtract.incrby ("долг", amttosubtract); // Долг кредитной карты увеличивает деньги AmttoSubtract Sist <object> result = transaction.exec ();//транзакция исполнение, если (result) null) ablishaction wablemiscation, transcation, IFSERCACTION, IF (Result), а). Данные были изменены во время системы выполнения. выбросить новый прерываний (); } else {// Отправление транзакции Успешное баланс = integer.parseint (jedis.get ("balance")); долг = integer.parseint (jedis.get ("долг")); System.out.println ("Конец выполнения транзакции вывода ..."); System.out.println («Ваш доступный баланс:»+баланс); System.out.println («Вы в настоящее время должны деньги:»+долг); вернуть истину; }}}}}Запустите его снова и увидите эффект:
Это показывает, что если данные изменяются после выполнения команды Watch и до того, как транзакция будет представлена, выполнение транзакции не будет успешным, что обеспечивает безопасность данных.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.