Det finns ett antal satser som orsakar en implicit commit, och ingen av dessa kan användas i en lagrad funktion eller en trigger, eller i en lagrad procedur som anropas från en lagrad funktion eller trigger, eftersom det egentligen inte skiljer sig i sin nettoeffekt.
En stunds reflektion förklarar orsaken till detta:lagrade funktioner (och triggers) körs medan en fråga körs . De börjar alltid, utan undantag, exekvera efter att frågan startar och avslutar exekveringen innan frågan avslutas. De kan också köras flera gånger under körningen av en enda fråga, särskilt när frågan omfattar flera rader.
I det ljuset skulle det inte vara meningsfullt om det var möjligt att COMMIT
en transaktion medan en enskild fråga körs... och det är vad som START TRANSACTION
gör det, om en transaktion körs -- begår den implicit den aktuella transaktionen och startar en ny.
Detta är bra i en lagrad procedur, så länge du inte anropar den mitt i en annan fråga (via en lagrad funktion eller trigger, vilket är det enda sättet att anropa en procedur mitt i en annan fråga) utan gör vad du gör här stöds inte... även om det inte finns en transaktion som kör, är det fortfarande inte möjligt att starta en transaktion mitt i en pågående fråga.
http://dev.mysql.com/doc/refman /5.6/en/implicit-commit.html