Esistono numerose istruzioni che causano un commit implicito e nessuna di queste può essere utilizzata all'interno di una funzione memorizzata o di un trigger, o in una procedura memorizzata chiamata da una funzione o un trigger memorizzati perché non è davvero diverso nel suo effetto netto.
Una breve riflessione ne spiega il motivo:le funzioni memorizzate (e i trigger) vengono eseguite mentre una query è in esecuzione . Sempre, senza eccezioni, iniziano l'esecuzione dopo l'avvio della query e terminano l'esecuzione prima del termine della query. Possono anche essere eseguiti più volte durante l'esecuzione di una singola query, in particolare quando la query coinvolge più righe.
Alla luce di ciò, non avrebbe senso se fosse possibile COMMIT
una transazione mentre è in esecuzione una singola query... ed è quello che START TRANSACTION
fa, se una transazione è in esecuzione -- esegue il commit implicito della transazione corrente e ne avvia una nuova.
Questo va bene in una procedura memorizzata, purché non la chiami nel mezzo di un'altra query (tramite una funzione o un trigger memorizzato, che è l'unico modo per invocare una procedura nel mezzo di un'altra query) ma facendo ciò che stai facendo qui non è supportato... anche se non c'è una transazione in esecuzione, non è comunque possibile avviare una transazione nel mezzo di una query in esecuzione.
http://dev.mysql.com/doc/refman /5.6/en/commit-implicito.html