Концепции и характеристики транзакций базы данных MySQL, а также синтаксис и процесс выполнения транзакций в MySQL.

Концепции и характеристики транзакций базы данных

Транзакция базы данных представляет собой механизм, последовательность операций и включает в себя набор команд работы с базой данных. Транзакция отправляет или отзывает запрос операции в систему вместе со всеми командами в целом, то есть этот набор команд базы данных либо выполняется, либо не выполняется, поэтому транзакция представляет собой неделимую логическую единицу работы.

При выполнении параллельных операций в системе баз данных транзакции используются как наименьшая единица управления, что особенно подходит для систем баз данных, которыми одновременно управляют несколько пользователей. Например, системы бронирования авиабилетов, банки, страховые компании и системы торговли ценными бумагами.

Транзакции имеют четыре характеристики: атомарность, согласованность, изоляцию и долговечность.Эти четыре характеристики обычно называются ACID.

1. Атомность

Транзакция представляет собой законченную операцию. Элементы транзакции неделимы (атомарны). Все элементы транзакции должны быть зафиксированы или отменены как единое целое. Если какой-либо элемент транзакции завершается неудачей, вся транзакция завершается неудачей.

Если взять в качестве примера транзакцию банковского перевода, то если транзакция будет отправлена, данные двух счетов будут обновлены. Если по какой-либо причине транзакция завершится до успешного обновления обеих учетных записей, балансы обеих учетных записей не будут обновлены, изменения в любых балансах счетов будут отменены, и транзакция не может быть частично зафиксирована.

2. Последовательность

Когда транзакция завершится, данные должны находиться в согласованном состоянии. То есть данные, хранящиеся в базе данных, находятся в согласованном состоянии до начала транзакции. Во время текущей транзакции данные могут находиться в несогласованном состоянии, например, данные могут быть частично изменены. Однако, когда транзакция завершится успешно, данные должны быть снова возвращены в известное согласованное состояние. Изменения данных, внесенные посредством транзакций, не могут повредить данные, или транзакции не могут оставить хранилище данных в нестабильном состоянии.

В качестве примера возьмем транзакцию банковского перевода. До начала транзакции общая сумма остатков на всех счетах находится в согласованном состоянии. В ходе транзакции баланс одного счета уменьшается, в то время как баланс другого счета не изменяется. Таким образом, общая сумма всех остатков на счетах является непоследовательной. После завершения транзакции общий баланс счета снова восстанавливается до согласованного состояния.

3. Изоляция

Все параллельные транзакции, изменяющие данные, изолированы друг от друга, а это означает, что транзакции должны быть независимыми и не должны каким-либо образом зависеть от других транзакций или влиять на них. Транзакция, изменяющая данные, может получить доступ к данным до начала другой транзакции, использующей те же данные, или после завершения другой транзакции, использующей те же данные.

Кроме того, когда транзакция изменяет данные, если какой-либо другой процесс одновременно использует те же данные, изменения данных не вступят в силу до тех пор, пока транзакция не будет успешно зафиксирована. Передача между Чжан Санем и Ли Си и передача между Ван Ву и Чжао Эр всегда независимы друг от друга.

4. Долговечность

Долговечность транзакций означает, что независимо от того, выйдет ли из строя система, результаты обработки транзакций постоянны.

После успешного завершения транзакции изменения, внесенные в базу данных, остаются постоянными, даже если система выйдет из строя. То есть, как только транзакция будет зафиксирована, любые изменения, внесенные в данные транзакцией, будут навсегда сохранены в базе данных.

Принцип транзакций ACID гарантирует, что транзакция либо успешно зафиксирована, либо не удалась и откатилась, либо одно из двух. Следовательно, внесенные в транзакцию изменения подлежат возмещению. То есть в случае сбоя транзакции изменения ее данных будут восстановлены до состояния, существовавшего до выполнения транзакции.

Синтаксис и процесс выполнения транзакций MySQL

MySQL предоставляет несколько механизмов хранения для поддержки транзакций. Механизмы хранения, поддерживающие транзакции, включают InnoDB и BDB. Транзакции механизма хранения InnoDB в основном реализуются через журналы UNDO и REDO. Механизм хранения MyISAM не поддерживает транзакции.

Расширение: Любой тип базы данных будет иметь различные журналы для записи рабочего состояния, ежедневных операций, сообщений об ошибках и т. д. базы данных, и MySQL не является исключением. Например, когда пользователь root входит в систему на сервере MySQL, время входа пользователя, операции выполнения и т. д. будут записаны в файл журнала.

Для обслуживания сервера MySQL часто необходимо выполнять операции журнала в базе данных MySQL:

  • Журнал ОТМЕНЫ: копирует данные перед выполнением транзакции и используется для отката данных при возникновении исключения в транзакции.
  • Журнал REDO: записывает каждую операцию, которая обновляет данные во время выполнения транзакции. Когда транзакция фиксируется, содержимое будет сброшено на диск.

Полная практика базовых навыков работы с базами данных Mysql icon-default.png?t=N7T8https://edu.csdn.net/course/detail/36210
При настройках по умолчанию каждый оператор SQL представляет собой транзакцию, то есть он автоматически отправляется после выполнения оператора SQL. Чтобы объединить несколько операций в одно целое, вам необходимо использовать BEGIN или START TRANSACTION для запуска транзакции, либо отключить автоматическую отправку текущей сессии.

Для получения информации об автоматической отправке транзакций вы можете прочитать раздел  « Настройка MySQL для автоматической отправки транзакций ».

Синтаксис и процесс выполнения транзакций

SQL использует следующие инструкции для управления транзакциями.

1) Начать транзакцию
BEGIN;

 или

START TRANSACTION;

Этот оператор явно отмечает отправную точку транзакции.

2) Отправить транзакцию

MySQL использует следующий оператор для фиксации транзакции:

COMMIT;

COMMIT означает фиксацию транзакции, то есть фиксацию всех операций транзакции. В частности, все обновления базы данных в транзакции записываются в физическую базу данных на диске, и транзакция завершается нормально.

Завершение транзакции означает, что все данные, выполненные с момента начала транзакции, будут изменены и станут постоянной частью базы данных, что также отмечает окончание транзакции. После выполнения этой команды откат транзакции невозможен. Эта операция выполняется только тогда, когда все изменения готовы к фиксации в базе данных.

3) Откат (отмена) транзакции

MySQL откатывает транзакцию, используя следующий оператор:

ROLLBACK;

ROLLBACK означает отмену транзакции, то есть во время выполнения транзакции происходит какой-то сбой и транзакция не может быть продолжена.Система отменит все завершенные операции с базой данных в транзакции и откатится к состоянию в начале сделки. Здесь операция относится к операции обновления базы данных.

Если во время выполнения транзакции возникает ошибка, используйте инструкцию ROLLBACK, чтобы откатить транзакцию обратно к начальной точке или указанной точке удержания. В то же время система удалит все изменения данных, сделанные с начальной точки транзакции или до определенной точки сохранения, и освободит ресурсы, контролируемые транзакцией. Таким образом, этот оператор также отмечает завершение транзакции.

Подведем итог

Операции обновления данных базы данных с помощью операторов SQL, следующих за оператором BEGIN или START TRANSACTION, будут записываться в журнал транзакций до тех пор, пока не встретится оператор ROLLBACK или оператор COMMIT. Если операция в транзакции завершается неудачей и выполняется инструкция ROLLBACK, все обновленные данные после открытия инструкции транзакции могут быть отброшены к состоянию до начала транзакции. Если все операции в транзакции выполнены правильно и оператор COMMIT используется для отправки обновленных данных в базу данных, данные в этот момент находятся в новом согласованном состоянии.

Пример демонстрации

Ниже приведены два примера, демонстрирующие конкретное использование транзакций MySQL.

Пример 1

Ниже моделируется сценарий, в котором другие сеансы получают доступ к таблице данных после того, как счет Чжан Саня уменьшился на 500 юаней, но счет Ли Си не увеличился на 500 юаней. Поскольку код необходимо выполнить в двух окнах, для удобства чтения мы называем их здесь окном А и окном Б.

1) Откройте транзакцию в окне A и обновите данные банковской таблицы в базе данных mybank. Оператор SQL и результаты выполнения следующие:

mysql> USE mybank;
Database changed
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE bank SET currentMoney = currentMoney-500
    -> WHERE customerName='张三';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

2) Запросите данные в таблице банковских данных в окне B. Оператор SQL и результаты выполнения следующие:

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

Из результатов видно, что хотя транзакция в окне А изменила данные в банковской таблице, данные обновляются не сразу, в это время другие сеансы все равно считывают данные до обновления.

3) Продолжайте выполнять транзакцию в окне A и отправляйте транзакцию. Оператор SQL и результаты выполнения следующие:

mysql> UPDATE bank SET currentMoney = currentMoney+500
    -> WHERE customerName='李四';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)

4) Снова запросите данные таблицы банковских данных в окне B. Оператор SQL и результаты выполнения следующие:

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

После выполнения COMMIT для фиксации транзакции в окне A обновления данных будут отправлены вместе, и другие сеансы будут читать обновленные данные. Из результатов видно, что общий баланс счетов Чжан Саня и Ли Си остается таким же, как и до перевода, так что данные обновляются из одного состояния согласованности в другое.

Как упоминалось ранее, когда во время выполнения транзакции возникает проблема, то есть когда полная транзакция не может быть выполнена в соответствии с обычным процессом, вы можете использовать оператор ROLLBACK для отката и использовать данные для восстановления в исходное состояние.

В примере 1 баланс счета Чжан Саня уменьшен до 500 юаней. Если перевести еще 1000 юаней, баланс будет отрицательным, поэтому его необходимо откатить до исходного состояния. Как показано в примере 2.

Пример 2

Уменьшите баланс счета Чжан Саня на 1000 юаней и откатите транзакцию. Оператор SQL и результаты выполнения следующие:

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
 
mysql> UPDATE bank SET currentMoney = currentMoney-1000 WHERE customerName='张三';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> ROLLBACK;
Query OK, 0 rows affected (0.07 sec)
 
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

Из результатов видно, что после выполнения отката транзакции данные аккаунта восстанавливаются в исходное состояние, то есть состояние до выполнения транзакции.

расширять

В операциях с базой данных для эффективного обеспечения корректности одновременно читаемых данных предлагается уровень изоляции транзакций. В демонстрациях Примера 1 и Примера 2 уровень изоляции транзакции является уровнем изоляции по умолчанию. В MySQL уровнем изоляции транзакции по умолчанию является уровень изоляции REPEATABLE-READ (перечитаемый), то есть, когда транзакция не завершена (COMMIT или ROLLBACK не выполняется), другие сеансы могут только читать незафиксированные данные.

Нажмите «Уровни изоляции транзакций MySQL» , чтобы узнать больше.

Меры предосторожности

Транзакция MySQL — очень ресурсоемкая функция, при ее использовании следует обратить внимание на следующие моменты.

1) Делайте транзакции как можно короче

От начала до конца транзакции в системе управления базой данных будет зарезервировано большое количество ресурсов, чтобы обеспечить атомарность, согласованность, изоляцию и надежность транзакции. В многопользовательской системе крупные транзакции будут занимать большой объем системных ресурсов, что приведет к перегрузке системы, влиянию на производительность программного обеспечения и даже к сбою системы.

2) Объем данных, к которым осуществляется доступ в транзакции, должен быть минимизирован.

Когда транзакции выполняются одновременно, чем меньше объем данных, с которыми работает транзакция, тем меньше операций с одними и теми же данными между транзакциями.

3) Старайтесь не использовать транзакции при запросе данных.

Просмотр и запрос данных не будут обновлять данные в базе данных, поэтому старайтесь не использовать транзакции для запроса данных, чтобы не занимать чрезмерные системные ресурсы.

4) Старайтесь не ждать ввода пользователя во время обработки транзакции.

Если во время обработки транзакции вам нужно дождаться ввода данных пользователем, транзакция будет занимать ресурсы в течение длительного времени и может вызвать перегрузку системы.

Старший инженер по базам данных Дачан, практическое обучение работе с базами данных MySQL icon-default.png?t=N7T8https://edu.csdn.net/course/detail/39021 

рекомендация

отblog.csdn.net/m0_37449634/article/details/135554108