Листинг 12.6.
mysql> ROLLBACK;
ERROR 1196: Some non-transactional changed tables couldn't be rolled back
А теперь снова выполним транзакцию, зафиксировав на этот раз все ее результаты. Листинг 12.7.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO employees (ename, enationality) VALUES ('Tim Jonez1, "US');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO dspartments (eid, dept) VALUES (LAST_INSERT_ID(),
'Accounts');
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO payroll (eid, pbasic, pbonus) VALUES (LAST_INSERT_ID(), 36000.00, 2500.00);
Query OK, 1 row affected (0.02 sec)
Проведем интересный эксперимент, заключающийся в создании еще одного подклю­чения к серверу и проверке результатов работы предыдущих запросов SQL.
Листинг 12.8.
mysql> SELECT * FROM employees;
Empty set (0.06 sec)
mysql> SELECT * FROM departments;
Empty set (0.03 sec)
mysql> SELECT * FROM payroll;
Empty set (0.04 sec)
Возможно, вы удивлены, что записи, добавленные в одном сеансе, никак не отобразились в другом. Не волнуйтесь - вы только что увидели принцип изолированности в действии. Как подчеркивалось в предыдущем разделе, изолированность означает, что транзакция становится видимой только после успешного завершения транзакции. Из-за того, что транзакция все еще выполняется и ее результаты не были сохранены на диск, она невидима для другого пользователя этой же самой базы данных (при необходимости установки видимости между транзакциями, это можно сделать путем установки различных уровней изолированности транзакции, что обсуждается в разделе "Уровни изолированности транзакций").
После того, как вы убедились, что все данные добавлены корректно, настало время с помощью команды COMMIT сохранить изменения, сделанные в таблицах. 

Листинг 12.9.
mysql> COMMIT;
Query OK, 0 rows affected (0.01 sec)
Командой COMMIT обозначается завершение блока транзакции. После завершения транзакции все изменения, произведенные этой транзакцией, становятся видимыми дру­гим клиентским сеансам.
На рис. 12.3 иллюстрируется жизненный цикл транзакции с помощью простой блок-схемы.
Необходимо отметить, что MySQL в своей работе использует модель плоской тран­закции: вложенные транзакции не разрешены и начало новой транзакции командой START TRANSACTION или BEGIN автоматически завершает предыдущую транзакцию. Кроме того, есть и другие команды MySQL, равносильные команде COMMIT:
■ DROP DATABASE/DROP TABLE
■ CREATE INDEX/DROP INDEX
■ ALTER TABLE/RENAME TABLE
■ LOCK TABLES/UNLOCK TABLES
■ SET AUTOCOMMIT = 1
Жизненный цикл транзакции
Шаг за шагом
Последние версии MySQL предусматривают поддержку точек сохранения, позво­ляющих размещать маркеры в критических точках во время выполнения транзакции, чтобы при необходимости иметь возможность сделать частичный откат транзакции. Это может пригодиться в случае возникновения ошибки при работе с длинными тран­закциями, такая точка сохранения позволяет откатить только ту часть транзакции, в результате выполнения которой произошла ошибка, а не всю транзакцию.
По точкам сохранения сейчас продолжаются разработки, поэтому следите за по­следними новостями.