Có một số câu lệnh gây ra một cam kết ngầm và không câu lệnh nào trong số này có thể được sử dụng bên trong một hàm được lưu trữ hoặc một trình kích hoạt, hoặc trong một thủ tục được lưu trữ được gọi từ một hàm hoặc trình kích hoạt được lưu trữ, bởi vì điều đó không thực sự khác biệt về hiệu ứng thực của nó.
Phản ánh của khoảnh khắc giải thích lý do cho điều này:các hàm được lưu trữ (và trình kích hoạt) thực thi trong khi truy vấn đang chạy . Chúng luôn luôn, không có ngoại lệ, bắt đầu thực thi sau khi truy vấn bắt đầu và kết thúc thực thi trước khi truy vấn kết thúc. Chúng cũng có thể chạy nhiều lần trong khi thực hiện một truy vấn, đặc biệt khi truy vấn liên quan đến nhiều hàng.
Trong trường hợp đó, sẽ không hợp lý nếu có thể COMMIT
một giao dịch trong khi một truy vấn đang chạy ... và đó là điều mà START TRANSACTION
thực hiện, nếu một giao dịch đang chạy - nó hoàn toàn cam kết giao dịch hiện tại và bắt đầu một giao dịch mới.
Điều này là tốt trong một thủ tục được lưu trữ, miễn là bạn không gọi nó ở giữa một truy vấn khác (thông qua một hàm hoặc trình kích hoạt được lưu trữ, đó là cách duy nhất để gọi một thủ tục ở giữa một truy vấn khác) nhưng làm gì bạn đang thực hiện ở đây không được hỗ trợ ... ngay cả khi không có giao dịch nào đang chạy, vẫn không thể bắt đầu giao dịch khi đang chạy truy vấn.
http://dev.mysql.com/doc/refman /5.6/en/implicit-commit.html