SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.02.2012 23:44:46

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Транзакции

Искала в инете про транзакции по вставлению в две таблицы, вроде нашла, переписала, на свою базу, но сервер плюётся ошибками, не понимаю, что не так, гугл отвечает не по теме ((

Start of transaction
INSERT INTO `db_1_mail_data`.`0` (`fid` ,`tid` ,`mid` ,`text` ,`readed` ,`time` ) VALUES ('1', '2', '354365445', 'aaaaaaa', '0', '435345');
INSERT INTO `db_2_mail_data`.`0` (`fid` ,`tid` ,`mid` ,`text` ,`readed` ,`time` ) VALUES ('1', '2', '354365445', 'aaaaaaa', '0', '435345');
  If ok then
   commit
  else
   rollback
  ;
 End of transaction


Скажи миру - НЯ!

Неактивен

 

#2 14.02.2012 01:57:05

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

sad


Скажи миру - НЯ!

Неактивен

 

#3 14.02.2012 04:50:14

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Транзакции

If ok then
   commit
  else
   rollback
  ;

Кажется, у Вас не MySQL?..

Неактивен

 

#4 14.02.2012 13:58:55

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

У меня как раз таки MySQL просто пример взяла с инета, не могу разобраться, вроде там тоже было про MySQL ((


Скажи миру - НЯ!

Неактивен

 

#5 14.02.2012 14:08:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

У MySQL другой синтаксис - http://dev.mysql.com/doc/refman/5.5/en/commit.html

Неактивен

 

#6 14.02.2012 14:11:21

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

У меня истерика, не понимаю я это дурацкий мануал от MySQL, вот от PHP хорошо сделан, легко понятно, а здесь всё в одну кучу свалено. и нету примеров. Вот я сверху написала INSERT  в две таблицы, мне надо чтоб, либо всё прошло, либо откатилось, но не могу понять как правильно.
Будьте добры, дайте работающий пример, чтоб я поняла принцип работы.


Скажи миру - НЯ!

Неактивен

 

#7 14.02.2012 14:42:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

start transaction;
insert into ...  ;
insert into ... ;

commit;
или
rollback;

Обратите внимание на последнюю часть. Вы должны написать явно одну из команд: commit или rollback. Т.е. ваш скрипт по ходу транзакции проверяет была ли ошибка и дает базе соответствующую команду на завершение.

Неактивен

 

#8 14.02.2012 14:43:08

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Транзакции

START TRANSACTION;
-- ..
-- что-то происходит
-- ..
COMMIT;

Перед тем, как пробовать, проверьте, что выключено автоматическое завершение транзакций  (SELECT @@autocommit должен давать 0; если дает 1 - сделайте SET @@autocommit = 0).

Все таблицы, к которым будут запросы, должны быть типа InnoDB (остальные механизмы хранения в MySQL транзакции сейчас не поддерживают).

Неактивен

 

#9 14.02.2012 14:44:24

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Так вот в этом и проблема, как прописать эту проверку? Нашла такой вариант:

If @@error_count>1 then
   rollback
  else
    commit
  ;

Тоже не работает ((((


Скажи миру - НЯ!

Неактивен

 

#10 14.02.2012 15:03:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

Можете после каждого запроса делать
select @@session.error_count;
и если вернулась 1 делать rollback

Неактивен

 

#11 14.02.2012 15:07:09

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Start of transaction
INSERT INTO `db_1_mail_data`.`0` (`fid` ,`tid` ,`mid` ,`text` ,`readed` ,`time` ) VALUES ('1', '2', '354365445', 'aaaaaaa', '0', '435345');
INSERT INTO `db_2_mail_data`.`0` (`fid` ,`tid` ,`mid` ,`text` ,`readed` ,`time` ) VALUES ('1', '2', '354365445', 'aaaaaaa', '0', '435345');
   If @@session.error_count=0 then
    commit
   else
    rollback
   ;
  End of transaction

Tak?


Скажи миру - НЯ!

Неактивен

 

#12 14.02.2012 15:18:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

Вы где это пишите?

Неактивен

 

#13 14.02.2012 15:25:20

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Через функцию PHP mysql_qeury(); Если пройдёт вернёт true, а вот если нет, надеюс, что false, так как сама функция стоит в условии IF в PHP скрипте


Скажи миру - НЯ!

Неактивен

 

#14 14.02.2012 15:25:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

Start  transaction; -- это команда, которую mysql получает от вашей программы
INSERT INTO `db_1_mail_data`.`0` (`fid` ,`tid` ,`mid` ,`text` ,`readed` ,`time` ) VALUES ('1', '2', '354365445', 'aaaaaaa', '0', '435345'); -- это команда, которую mysql получает от вашей программы
select @@session.error_count; -- это команда, которую mysql получает от вашей программы

/*далле ваша программа анализирует результат выполнения последней команды и если был 0 посылает следующую команду insert, иначе выполняет команду rollback;. И так до завершения транзакции. Если последняя команда выполнилась успешно, то ваша программа отправляет mysql команду commit;*/

Неактивен

 

#15 14.02.2012 15:27:49

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Так это получается, нельзя, это всё в один запрос запихнуть? sad


Скажи миру - НЯ!

Неактивен

 

#16 14.02.2012 15:31:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

Вам нужно многократно через mysql_qeury() посылать отдельные команды start transaction; insert.. ; select.. и т.д.

Неактивен

 

#17 14.02.2012 15:32:23

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Хорошо, смерилась, а select @@session.error_count обулится после commit?


Скажи миру - НЯ!

Неактивен

 

#18 14.02.2012 15:35:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

animegirl написал:

Так это получается, нельзя, это всё в один запрос запихнуть? sad

Если бы вы хотели просто выполнить несколько запросов подряд в рамках одной транзакции и её завершением в любом случае был бы commit, то можно было запихнуть в один запрос через mysqli_multi_qeury().
А так как хотите вы нельзя.

Неактивен

 

#19 14.02.2012 15:36:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

animegirl написал:

Хорошо, смерилась, а select @@session.error_count обулится после commit?

После каждого запроса.

Неактивен

 

#20 14.02.2012 15:40:58

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Мне его после каждого INSERTa проверять, и если не проходит делать откат, а в конце, если не было откатов, то сделать commit, верно поняла?


Скажи миру - НЯ!

Неактивен

 

#21 14.02.2012 18:53:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

Да.

Неактивен

 

#22 15.02.2012 01:09:03

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Я правильно поняла, что в MySQL нету команды END TRANSACTION как таковой? И транзакция закрывается через commit или rollback?


Скажи миру - НЯ!

Неактивен

 

#23 15.02.2012 01:24:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Транзакции

END TRANSACTION и commit - синонимы

Неактивен

 

#24 19.02.2012 19:52:22

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

Не срабатывает rollback на ошибке, задумалась, я ведь все команды выполняю на базе, где все таблицы FEDERATED, но ссылаются на innoDB в этом причина не срабатывания?


Скажи миру - НЯ!

Неактивен

 

#25 26.02.2012 15:59:05

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Транзакции

???


Скажи миру - НЯ!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson