Der er en række udsagn, der forårsager en implicit commit, og ingen af disse kan bruges i en lagret funktion eller en trigger, eller i en lagret procedure, der kaldes fra en lagret funktion eller trigger, fordi det egentlig ikke er anderledes i sin nettoeffekt.
Et øjebliks refleksion forklarer årsagen til dette:lagrede funktioner (og triggere) udføres mens en forespørgsel kører . De begynder altid, uden undtagelse, at udføre efter forespørgslen starter, og afslutter eksekveringen før forespørgslen slutter. De kan også køre flere gange under udførelsen af en enkelt forespørgsel, især når forespørgslen involverer flere rækker.
I det lys ville det ikke give mening, hvis det var muligt at COMMIT
en transaktion mens en enkelt forespørgsel kører... og det er hvad START TRANSACTION
gør, hvis en transaktion kører -- forpligter den implicit den aktuelle transaktion og starter en ny.
Dette er fint i en lagret procedure, så længe du ikke kalder den midt i en anden forespørgsel (via en lagret funktion eller trigger, som er den eneste måde at påkalde en procedure midt i en anden forespørgsel), men gør hvad du gør her er ikke understøttet... selvom der ikke er en transaktion kørende, er det stadig ikke muligt at starte en transaktion midt i en kørende forespørgsel.
http://dev.mysql.com/doc/refman /5.6/da/implicit-commit.html