English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MySQL транзакции主要用于 обработку данных с большой объемом и высокой сложностью. Например, в системе управления персоналом, если вы удаляете сотрудника, вам нужно удалить как основные данные сотрудника, так и информацию, связанную с этим сотрудником, такую как почтовый ящик, статьи и т.д., и поэтому эти операторы базы данных образуют одну транзакцию!
В MySQL транзакции поддерживаются только в базах данных или таблицах, использующих двигатель базы данных InnoDB.
Обработка транзакций можно использовать для поддержания целостности базы данных, гарантируя, что все批евые SQL-запросы будут выполняться полностью или не выполняться вовсе.
Транзакция используется для управления запросами insert, update, delete
В общем, транзакция должна соответствовать четырем условиям (ACID): атомарность (AАтомарность, или называемая неразделимостью), консистентность (CКонсистентность), изоляция (IИзоляция, также известная как независимость), постоянство (DУстойчивость).
Атомарность:Все операции в одной транзакции должны быть выполнены полностью или не выполняться вовсе, не завершаясь на каком-либо промежуточном этапе. Если в процессе выполнения транзакции возникает ошибка, транзакция будет откатана (Rollback) до состояния, в котором она начала, так как если бы транзакция никогда не выполнялась.
Консистентность:До начала транзакции и после ее завершения целостность базы данных не разрушается. Это означает, что вводимые данные должны полностью соответствовать всем предварительно заданным правилам, включая точность данных, целостность данных и способность базы данных автоматически выполнять запланированные работы.
Изоляция:База данных позволяет нескольким транзакциям одновременно выполнять чтение, запись и модификацию своих данных, изоляция предотвращает возникновение несовместимости данных при параллельном выполнении транзакций. Изоляция транзакций делится на несколько уровней, включая чтение до обновления (Read uncommitted), чтение после обновления (read committed), повторяемое чтение (repeatable read) и сериализация (Serializable).
Постоянство:После завершения обработки транзакции изменения данных становятся постоянными, даже если произойдет сбой системы.
В стандартных настройках командной строки MySQL транзакции автоматически выполняются, то есть после выполнения SQL-запроса автоматически выполняется операция COMMIT. Поэтому для явного начала транзакции необходимо использовать команду BEGIN или START TRANSACTION, или выполнить команду SET AUTOCOMMIT=0, чтобы запретить использование автоматического выполнения транзакций в текущем сеансе.
BEGIN или START TRANSACTION явно открывает транзакцию;
COMMIT также может использовать COMMIT WORK, но они эквивалентны. COMMIT подтверждает транзакцию, и все изменения, сделанные в базе данных, становятся постоянными;
ROLLBACK также может использовать ROLLBACK WORK, но они эквивалентны. Откат завершает транзакцию пользователя и отменяет все не сохраненные изменения;
SAVEPOINT identifier, SAVEPOINT позволяет создать точку сохранения в транзакции, в одной транзакции может быть несколько SAVEPOINT;
RELEASE SAVEPOINT identifier удалить точку сохранения транзакции, при отсутствии указанной точки сохранения выполнение этого предложения вызовет исключение;
ROLLBACK TO identifier откат транзакции до маркера;
SET TRANSACTION используется для установки уровня изоляции транзакции. ИнnoDB хранилище предоставляет уровни изоляции транзакции: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE.
1、Использовать BEGIN, ROLLBACK, COMMIT для реализации
BEGIN Начало транзакции
ROLLBACK Откат транзакции
COMMIT Подтверждение транзакции
2、Прямо использовать SET для изменения режима автоматического коммита MySQL:
SET AUTOCOMMIT=0 Запрещение автоматического коммита
SET AUTOCOMMIT=1 Включение автоматического коммита
mysql> use w3codebox; База данных изменена mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # Создание таблицы данных Запрос ОК, 0 строк изменено (0.04 сек) mysql> select * from w3codebox_transaction_test; Пустой множества (0.01 сек) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test value(5); Query OK, 1 row affected (0.01 sec) mysql> insert into w3codebox_transaction_test value(6); Query OK, 1 row affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from w3codebox_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test values(7); Query OK, 1 row affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from w3codebox_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
<?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db($conn, 'w3codebox'); mysqli_query($conn, "SET AUTOCOMMIT=0"); // Установлено не автоматически выполнять, так как MYSQL по умолчанию выполняет немедленно mysqli_begin_transaction($conn); // Начало транзакции if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // Возврат к началу при ошибке выполнения } if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // Возврат к началу при ошибке выполнения } mysqli_commit($conn); // Выполнение транзакции mysqli_close($conn); ?>