|
|
|
| Объясните новичку: возможно ли в mysql применять транзакции, и как это сделать. | |
|
|
|
|
|
|
|
для: kir
(07.02.2006 в 22:29)
| | Таблицы ISAM, MyISAM и HEAP не поддерживают транзакции. В настоящий момент их поддержка осуществляется только в таблицах BDB и InnoDB. Т.е. вам придётся использовать InnoDB, так как BDB помоему пока в стандартную поставку не входит. Следует заметить, что транзакционные таблицы в несколько раз медленее MyISAM.
По умолчанию СУБД MySQL работает в режиме автоматического завершения транзакций, т.е. как только выполняется оператор обновления данных, который модифицирует таблицу, MySQL тут же сохраняет изменения на диске. Для объединения в транзакцию нескольких операторов необходимо отключить этот режим. Это можно осуществить при помощи оператора SET AUTOCOMMIT
После отключения режима автоматического завершения транзакций следует использовать оператор COMMIT, чтобы сохранить изменения на диске, либо ROLLBACK, чтобы отменять изменения, выполненные с момента начала транзакции. Для того, чтобы включить режим автоматического завершения транзакций необходимо выполнить оператор SET AUTOCOMMIT=1.
mysql> SET AUTOCOMMIT=0;
mysql> INSERT INTO catalogs VALUES(NULL,'Переферия');
mysql> INSERT INTO catalogs VALUES(NULL,'Разное');
mysql> SELECT * FROM catalogs;
+------------+--------------------+
| id_catalog | name |
+------------+--------------------+
| 1 | Процессоры |
| 2 | Материнские платы |
| 3 | Видеоадаптары |
| 4 | Жёсткие диски |
| 5 | Оперативная память |
| 6 | Переферия |
| 7 | Разное |
+------------+--------------------+
mysql> ROLLBACK;
mysql> SELECT * FROM catalogs;
+------------+--------------------+
| id_catalog | name |
+------------+--------------------+
| 1 | Процессоры |
| 2 | Материнские платы |
| 3 | Видеоадаптары |
| 4 | Жёсткие диски |
| 5 | Оперативная память |
+------------+--------------------+
mysql> INSERT INTO catalogs VALUES(NULL,'Переферия');
mysql> INSERT INTO catalogs VALUES(NULL,'Разное');
mysql> COMMIT;
mysql> SELECT * FROM catalogs;
+------------+--------------------+
| id_catalog | name |
+------------+--------------------+
| 1 | Процессоры |
| 2 | Материнские платы |
| 3 | Видеоадаптары |
| 4 | Жёсткие диски |
| 5 | Оперативная память |
| 9 | Переферия |
| 10 | Разное |
+------------+--------------------+
mysql> SET AUTOCOMMIT=1;
|
В таблицу catalogs добавляются новые записи, при этом выполнения оператора ROLLBACK позволяет отменить все изменения, которые были произведены над таблицей catalogs. Напротив, оператор COMMIT сохраняет изменения на диске и уже следующий оператор ROLLBACK вернёт последнее сохранённое состояние.
Для того чтобы включить режим автоматического завершения транзакций только для отдельной последовательности операторов, можно воспользоваться оператором START TRANSACTION.
mysql> START TRANSACTION;
mysql> SELECT @total := count FROM products
-> WHERE name = 'Celeron D 320 2.4GHz';
+-----------------+
| @total := count |
+-----------------+
| 1 |
+-----------------+
mysql> UPDATE products SET count = @total - 1
-> WHERE name = 'Celeron D 320 2.4GHz';
mysql> COMMIT;
|
После выполнения оператора START TRANSACTION режим автоматического завершения транзакций остаётся включённым до явного завершения транзакции с помощью оператора COMMIT или отката транзакции при помощи ROLLBACK.
Для некоторых операторов нельзя выполнить откат при помощи ROLLBACK. К их числу относят CREATE INDEX, DROP INDEX, CREATE TABLE, DROP TABLE, TRUNCATE TABLE, ALTER TABLE, RENAME TABLE, CREATE DATABASE, DROP DATABASE, ALTER DATABASE. Следует избегать помещать их в транзакции с другими операторами.
Кроме того, существует ряд операторов, которые неявно завершают транзакцию, как если бы был вызван оператор COMMIT. К их числу относятся ALTER TABLE, BEGIN, CREATE INDEX, CREATE TABLE, CREATE DATABASE, DROP DATABASE, DROP INDEX, DROP TABLE, DROP DATABASE, LOAD MASTER DATA, LOCK TABLES, RENAME, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE.
PS Цитата из нашей новой книги "Самоучитель MySQL 5", выход которой запланирован на март 2006 года (надеюсь переносить больше не будут). | |
|
|
|
|
|
|
|
для: cheops
(08.02.2006 в 14:28)
| | Спасибо…
Простите, все вышеперечисленное (не тему оператора SET AUTOCOMMIT=1) относиться к таблицам InnoDB?
То есть если у меня есть доступ только к типам таблиц MyISAM, HEAP, MEMORY, MEARGE, MRG MyISAM, мне транзакций не видать как своих ушей? | |
|
|
|
|
|
|
|
для: Kir
(09.02.2006 в 20:02)
| | Для таких таблиц можно использоваться блокировки - т.е. во время операции будет блокироваться вся таблица - никто больше с ней работать не сможет - это годится? | |
|
|
|
|
|
|
|
для: cheops
(09.02.2006 в 22:11)
| | Спасибо..
Ну допустим мне нужно сделать целый ряд запросов через PHP к MySql (может не только запросов к базе а например записать какие то файлы которые нужно записывать только если все запросы прошли, и наоборот если файлы по какой то причине не записались, откатить базу), и в зависимости от того прошли ли все запросы (проверять как нибудь - например mysq_error()) - тут блокировка ведь не прокатит? | |
|
|
|
|
|
|
|
для: Kir
(09.02.2006 в 23:12)
| | Если системой будет пользоваться только один пользователь - то никаких проблем быть не должно, если несколько, то лучше не использовать. | |
|
|
|
|
|
|
|
для: cheops
(10.02.2006 в 13:46)
| | Спасибо... :( | |
|
|
|