Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> транзакции, как нужно делать 
:(
    Опции темы
tigger
Дата 9.12.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



Есть такая конструкция
Код

mysql_query('START TRANSACTION');
       try
         {
            mysql_query($query_upd);
            mysql_query($query_update_i);
            mysql_query('COMMIT');

          } catch(Exception $e)
                {
                   mysql_query('ROLLBACK');
                }

где $query_upd и $query_update_i запросы на обновление данных.
Вот эта приведенная мной конструкция корректна или это вообще по другому делается.
Таблицы InnoBD. В каких случаях нужны транзакции на запросах UPDATE и INSERT?
Поделитесь опытом. Главное условие чтобы не кончить базу.


--------------------
user posted image
PM MAIL   Вверх
vasac
Дата 9.12.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: нет
Всего: 36



А разве mysql_query() кидают исключения?
Посмотрите mysqli, там работа с транзакциями есть.
PM WWW   Вверх
mikla
Дата 9.12.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 3.12.2006
Где: Витебск

Репутация: нет
Всего: нет



я думаю, что коммит нада делать в самом конце. 
--------------------
PM MAIL ICQ Skype   Вверх
tigger
Дата 10.12.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



mysql_query('START TRANSACTION');
mysql_query($query_upd);
mysql_query($query_update_i);
mysql_query('COMMIT');

вот нашел что так делать надо, а как же обработать если запросы Update были не успешными?




--------------------
user posted image
PM MAIL   Вверх
Daevaorn
Дата 10.12.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Соедини запросы вместе и вызови mysql_query один раз. Соотвественно при какой-либо ошибке MySQL сам отменит транзакцию.
PM MAIL WWW   Вверх
tigger
Дата 10.12.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



как их соединяют?


--------------------
user posted image
PM MAIL   Вверх
vasac
Дата 10.12.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: нет
Всего: 36



mysql_query обрабатывает только один запрос.
http://ru2.php.net/manual/ru/function.mysqli-multi-query.php
PM WWW   Вверх
Kaiden
Дата 10.12.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 26.11.2007

Репутация: нет
Всего: нет



Цитата(tigger @  10.12.2007,  12:01 Найти цитируемый пост)
mysql_query('START TRANSACTION');
mysql_query($query_upd);
mysql_query($query_update_i);
mysql_query('COMMIT');

вот нашел что так делать надо, а как же обработать если запросы Update были не успешными?


В приницпе, вы можете проверять с помощью функции mysql_errno результат выполнения каждого запроса. Если хотя бы один раз mysql_errno вернула ненулевое значение ( т.е. была ошибка ), в конце вместо COMMIT вызывать ROLLBACK.

А лучше, конечно, обходиться одним запросом там, где это возможно.

Это сообщение отредактировал(а) Kaiden - 10.12.2007, 23:28
PM MAIL   Вверх
FCCStepan
Дата 12.12.2007, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 31.10.2007

Репутация: нет
Всего: нет



2tiger
я так понимаю
mysql_query($query_upd.";".$query_update_i);
но имхо транзакцию он сам отменять не будет, если один из запросов будет невыполнен.
PM MAIL   Вверх
ST_Falcon
Дата 13.12.2007, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

Репутация: нет
Всего: 1



tigger, 
Цитата

Вот эта приведенная мной конструкция корректна или это вообще по другому делается.


имхо отличная конструкция. использую когда нужно выполнить группу взаимосвязанных запросов (например перевод средств от одного участника системы к другому)
PM MAIL ICQ   Вверх
vi_k
Дата 31.12.2007, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.12.2007

Репутация: нет
Всего: нет



Функция mysql_query() возвращает результат своего выполнения, его и надо проверять:

Цитата

Только для запросов SELECT, SHOW, EXPLAIN, DESCRIBE, mysql_query() возвращает указатель на результат запроса, или FALSE если запрос не был выполнен. В остальных случаях, mysql_query() возвращает TRUE в случае успешного запроса и FALSE в случае ошибки. Значение не равное FALSE говорит о том, что запрос был выполнен успешно.


Пример:
Код

$result = mysql_query("SELECT * WHERE 1=1")
    or die("Invalid query: " . mysql_error());


Зачем всё остальное: mysql_errno() и исключения?


Цитата

mysql_query($query_upd.";".$query_update_i);


Нельзя. Только один запрос!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.