Existuje řada příkazů, které způsobují implicitní potvrzení, a žádný z nich nelze použít uvnitř uložené funkce nebo spouštěče, nebo v uložené proceduře, která je volána z uložené funkce nebo spouštěče, protože to se svým čistým efektem ve skutečnosti nijak neliší.
Krátké zamyšlení vysvětluje důvod:uložené funkce (a spouštěče) se provádějí za běhu dotazu . Vždy, bez výjimky, začnou provádět po spuštění dotazu a ukončí provádění před dokončením dotazu. Mohou se také spustit několikrát během provádění jednoho dotazu, zejména pokud dotaz zahrnuje více řádků.
V tomto světle by nedávalo smysl, kdyby bylo možné COMMIT
transakce, zatímco běží jeden dotaz... a to je to, co START TRANSACTION
ano, pokud transakce běží – implicitně potvrdí aktuální transakci a spustí novou.
To je v pořádku v uložené proceduře, pokud ji nevoláte uprostřed jiného dotazu (prostřednictvím uložené funkce nebo spouštěče, což je jediný způsob, jak vyvolat proceduru uprostřed jiného dotazu), ale děláte to, co kterou děláte, není podporováno... i když neprobíhá transakce, stále není možné zahájit transakci uprostřed běžícího dotazu.
http://dev.mysql.com/doc/refman /5.6/cs/implicit-commit.html