Istnieje wiele instrukcji, które powodują niejawne zatwierdzenie i żadna z nich nie może być użyta wewnątrz funkcji składowanej lub wyzwalacza, lub w procedurze składowanej, która jest wywoływana z funkcji składowanej lub wyzwalacza, ponieważ tak naprawdę nie różni się to efektem netto.
Chwila refleksji wyjaśnia przyczynę takiego stanu rzeczy:przechowywane funkcje (i wyzwalacze) są wykonywane podczas wykonywania zapytania . Zawsze, bez wyjątku, rozpoczynają wykonywanie po rozpoczęciu zapytania i kończą wykonywanie przed zakończeniem zapytania. Mogą również działać wiele razy podczas wykonywania pojedynczego zapytania, szczególnie gdy zapytanie obejmuje wiele wierszy.
W tym świetle nie miałoby sensu, gdyby było możliwe COMMIT
transakcja podczas wykonywania pojedynczego zapytania... i właśnie to START TRANSACTION
robi, jeśli transakcja jest uruchomiona - domyślnie zatwierdza bieżącą transakcję i rozpoczyna nową.
Jest to w porządku w procedurze składowanej, o ile nie wywołujesz jej w środku innego zapytania (za pośrednictwem funkcji składowanej lub wyzwalacza, co jest jedynym sposobem na wywołanie procedury w środku innego zapytania), ale robisz to, co nie jest obsługiwane... nawet jeśli nie jest uruchomiona transakcja, nadal nie jest możliwe rozpoczęcie transakcji w środku uruchomionego zapytania.
http://dev.mysql.com/doc/refman /5.6/pl/implicit-commit.html