Existem várias instruções que causam um commit implícito, e nenhuma delas pode ser usada dentro de uma função armazenada ou um gatilho, ou em um procedimento armazenado que é chamado de uma função armazenada ou gatilho, porque isso não é realmente diferente em seu efeito líquido.
Um momento de reflexão explica o motivo disso:funções armazenadas (e gatilhos) executam enquanto uma consulta está em execução . Eles sempre, sem exceção, começam a ser executados após o início da consulta e terminam a execução antes do término da consulta. Eles também podem ser executados várias vezes durante a execução de uma única consulta, principalmente quando a consulta envolve várias linhas.
Sob essa luz, não faria sentido se fosse possível
COMMIT
uma transação enquanto uma única consulta está em execução... e é isso que START TRANSACTION
faz, se uma transação estiver em execução -- ele confirma implicitamente a transação atual e inicia uma nova. Isso é bom em um procedimento armazenado, desde que você não o esteja chamando no meio de outra consulta (por meio de uma função ou gatilho armazenado, que é a única maneira de invocar um procedimento no meio de outra consulta), mas fazendo o que você está fazendo aqui não é suportado... mesmo que não haja uma transação em execução, ainda não é possível iniciar uma transação no meio de uma consulta em execução.
http://dev.mysql.com/doc/refman /5.6/en/implicit-commit.html