Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Транзакции
 
 автор: kir   (07.02.2006 в 22:29)   письмо автору
 
 

Объясните новичку: возможно ли в mysql применять транзакции, и как это сделать.

   
 
 автор: cheops   (08.02.2006 в 14:28)   письмо автору
 
   для: kir   (07.02.2006 в 22:29)
 

Таблицы ISAM, MyISAM и HEAP не поддерживают транзакции. В настоящий момент их поддержка осуществляется только в таблицах BDB и InnoDB. Т.е. вам придётся использовать InnoDB, так как BDB помоему пока в стандартную поставку не входит. Следует заметить, что транзакционные таблицы в несколько раз медленее MyISAM.
По умолчанию СУБД MySQL работает в режиме автоматического завершения транзакций, т.е. как только выполняется оператор обновления данных, который модифицирует таблицу, MySQL тут же сохраняет изменения на диске. Для объединения в транзакцию нескольких операторов необходимо отключить этот режим. Это можно осуществить при помощи оператора SET AUTOCOMMIT
mysql> SET AUTOCOMMIT=0;

После отключения режима автоматического завершения транзакций следует использовать оператор 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 года (надеюсь переносить больше не будут).

   
 
 автор: Kir   (09.02.2006 в 20:02)   письмо автору
 
   для: cheops   (08.02.2006 в 14:28)
 

Спасибо…
Простите, все вышеперечисленное (не тему оператора SET AUTOCOMMIT=1) относиться к таблицам InnoDB?
То есть если у меня есть доступ только к типам таблиц MyISAM, HEAP, MEMORY, MEARGE, MRG MyISAM, мне транзакций не видать как своих ушей?

   
 
 автор: cheops   (09.02.2006 в 22:11)   письмо автору
 
   для: Kir   (09.02.2006 в 20:02)
 

Для таких таблиц можно использоваться блокировки - т.е. во время операции будет блокироваться вся таблица - никто больше с ней работать не сможет - это годится?

   
 
 автор: Kir   (09.02.2006 в 23:12)   письмо автору
 
   для: cheops   (09.02.2006 в 22:11)
 

Спасибо..
Ну допустим мне нужно сделать целый ряд запросов через PHP к MySql (может не только запросов к базе а например записать какие то файлы которые нужно записывать только если все запросы прошли, и наоборот если файлы по какой то причине не записались, откатить базу), и в зависимости от того прошли ли все запросы (проверять как нибудь - например mysq_error()) - тут блокировка ведь не прокатит?

   
 
 автор: cheops   (10.02.2006 в 13:46)   письмо автору
 
   для: Kir   (09.02.2006 в 23:12)
 

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

   
 
 автор: Kir   (11.02.2006 в 15:57)   письмо автору
 
   для: cheops   (10.02.2006 в 13:46)
 

Спасибо... :(

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования