sp:begin
start transaction
select <...> into <...> from ...
if @error_count > 0 then
rollback;
leave sp;
end if;
replace into Host ...
if @error_count > 0 then
rollback;
leave sp;
end if;
update Account set ...
if @error_count > 0 then
rollback;
leave sp;
end if;
commit;
select ...
end $$
Транзакции в MySQL
Подробнее:
СУБД MySQL
Все таблицы InnoDB.
Внутри ХП-шки выполняется примерно следующий запрос
(выкладываю только код, который актуален для этого вопроса):
Код:
Проблемы следующие:
1. Если что-то падает в запросе rollback нефига не выполняется - вернее вообще не выполняется вот этот блок:
if @error_count > 0 then
rollback;
leave sp;
end if;
2. Если ничего не падает, каого-то фига не выполняется select коорый после commit-а.
Вот это даже пожалуй больше даже беспокоит... - т.е. с чего вдруг не выполняется то что соит после commit-а ?
Во вторых - попробуйте вместо start transaction указать begin;
т.е. например в последнем апдейте обновляются поля одно из которых unique - специально создаю такую ситацию при которой в него пытается записаться значение кторое уже есть в базе - так вот апдейт отваливается, а изменения произошедшие в предидущем реплейсе остаются...
2. А begin вроде в MySQL-е не катит - один фиг автокоммит после каждой операции...
-------------------------
И всё таки не понятна судьба последнего селекта, кторый после коммита - ХП-шка отрабатывает как будто его вообще нет...