![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Искала в инете про транзакции по вставлению в две таблицы, вроде нашла, переписала, на свою базу, но сервер плюётся ошибками, не понимаю, что не так, гугл отвечает не по теме ((
Неактивен
![]()
Неактивен

If ok then
commit
else
rollback
;
Кажется, у Вас не MySQL?..
Неактивен
У меня как раз таки MySQL просто пример взяла с инета, не могу разобраться, вроде там тоже было про MySQL ((
Неактивен

У MySQL другой синтаксис - http://dev.mysql.com/doc/refman/5.5/en/commit.html
Неактивен
У меня истерика, не понимаю я это дурацкий мануал от MySQL, вот от PHP хорошо сделан, легко понятно, а здесь всё в одну кучу свалено. и нету примеров. Вот я сверху написала INSERT в две таблицы, мне надо чтоб, либо всё прошло, либо откатилось, но не могу понять как правильно.
Будьте добры, дайте работающий пример, чтоб я поняла принцип работы.
Неактивен

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

START TRANSACTION;
-- ..
-- что-то происходит
-- ..
COMMIT;
Перед тем, как пробовать, проверьте, что выключено автоматическое завершение транзакций (SELECT @@autocommit должен давать 0; если дает 1 - сделайте SET @@autocommit = 0).
Все таблицы, к которым будут запросы, должны быть типа InnoDB (остальные механизмы хранения в MySQL транзакции сейчас не поддерживают).
Неактивен
Так вот в этом и проблема, как прописать эту проверку? Нашла такой вариант:
Неактивен

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

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

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;*/
Неактивен
Так это получается, нельзя, это всё в один запрос запихнуть? ![]()
Неактивен

Вам нужно многократно через mysql_qeury() посылать отдельные команды start transaction; insert.. ; select.. и т.д.
Неактивен
Хорошо, смерилась, а select @@session.error_count обулится после commit?
Неактивен

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

animegirl написал:
Хорошо, смерилась, а select @@session.error_count обулится после commit?
После каждого запроса.
Неактивен
Мне его после каждого INSERTa проверять, и если не проходит делать откат, а в конце, если не было откатов, то сделать commit, верно поняла?
Неактивен
Я правильно поняла, что в MySQL нету команды END TRANSACTION как таковой? И транзакция закрывается через commit или rollback?
Неактивен

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