Задавайте вопросы, мы ответим
Вы не зашли.
Искала в инете про транзакции по вставлению в две таблицы, вроде нашла, переписала, на свою базу, но сервер плюётся ошибками, не понимаю, что не так, гугл отвечает не по теме ((
Неактивен
Неактивен
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 в этом причина не срабатывания?
Неактивен
???
Неактивен