Hay una serie de declaraciones que provocan una confirmación implícita, y ninguna de ellas se puede usar dentro de una función almacenada o un disparador, o en un procedimiento almacenado que se llama desde una función almacenada o un disparador, porque eso no es realmente diferente en su efecto neto.
Un momento de reflexión explica la razón de esto:las funciones almacenadas (y los activadores) se ejecutan mientras se ejecuta una consulta . Siempre, sin excepción, comienzan a ejecutarse después de que comience la consulta y terminan de ejecutarse antes de que finalice la consulta. También pueden ejecutarse varias veces durante la ejecución de una sola consulta, especialmente cuando la consulta involucra varias filas.
Bajo esa luz, no tendría sentido si fuera posible COMMIT
una transacción mientras se ejecuta una sola consulta... y eso es lo que START TRANSACTION
lo hace, si se está ejecutando una transacción, implícitamente confirma la transacción actual y comienza una nueva.
Esto está bien en un procedimiento almacenado, siempre y cuando no lo esté llamando en medio de otra consulta (a través de una función almacenada o disparador, que es la única forma de invocar un procedimiento en medio de otra consulta) pero haciendo lo que lo que está haciendo aquí no es compatible... incluso si no hay una transacción en ejecución, aún no es posible iniciar una transacción en medio de una consulta en ejecución.
http://dev.mysql.com/doc/refman /5.6/es/compromiso-implícito.html