Глава 12. Транзакции
Вот пример использования точек сохранения:
START TRANSACTION;
UPDATE product
SET date_retired = CURRENT_TIMESTAMP( )
WHERE product_cd = 'XYZ';
SAVEPOINT before_close_accounts;
UPDATE account
SET status = 'CLOSED', close_date = CURRENT_TIMESTAMP( ),
last_activity_date = CURRENT_TIMESTAMP( )
WHERE product_cd = 'XYZ';
ROLLBACK TO SAVEPOINT before_close_accounts;
COMMIT;
Результирующий эффект этой транзакции состоит в том, что фиктив
ный тип счета
XYZ
выходит из обращения, но ни один из счетов не за
крывается.
Не надо думать, что MySQL вынуждает выбирать для БД единст
венный механизм хранения. Этот сервер достаточно гибок
и обеспечивает возможность применять для каждой таблицы
собственный механизм хранения. Однако для всех таблиц, кото
рые могут принимать участие в транзакциях, следовало бы ис
пользовать механизм хранения InnoDB, применяющий блоки
ровку на уровне строки и контроль версий, обеспечивая тем са
мым наиболее высокий уровень согласованности из всех меха
низмов хранения.
Механизм хранения можно задавать явно при создании таблицы
или изменять его для уже существующей таблицы. Если меха
низм хранения таблицы не известен, можно воспользоваться ко
мандой
show
table
, например:
mysql> SHOW TABLE STATUS LIKE 'transaction' \G
********************* 1. row *********************
Name: transaction
Engine: InnoDB
...
Create_options:
Comment: InnoDB free: 3072 kB; ...
Взглянув на второй элемент, можно понять, что таблица
transac
tion
уже использует механизм InnoDB. Если бы это было не так,
можно было бы назначить механизм InnoDB для этой таблицы
посредством следующей команды:
ALTER TABLE transaction ENGINE = INNODB;