我想知道MySQL中的存储过程是否比具有一些限制的http://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html)的SQL语句序列更多。
交易,InnoDB表上的DML等有什么特别之处吗?
据我所知,事实并非相反。
编辑:
执行流程也是一个有趣的问题。
假设我有以下简单程序并且自动提交已关闭:
CREATE PROCEDURE someproc ()
-> BEGIN
-> -- exec stmt1
-> -- exec stmt2 <--- assume it fails!
-> -- exec stmt3
-> END//
如果stmt2由于某种原因在执行期间失败会发生什么?
在我看来,stmt2更改将被回滚,但stmt1更改不会,并且程序的执行流程将被停止,因此stmt3将不会执行。
答案 0 :(得分:1)
MySQL存储程序支持SQL语句之外的语法,例如声明变量,条件分支,循环,游标,动态SQL等。从这个意义上讲,它不仅仅是一系列SQL语句。
没有什么&#34;特别&#34;关于InnoDB表上的DML语句或MySQL存储程序中的事务。就允许的操作而言,程序是最宽松的。对FUNCTIONS和TRIGGERS有一些限制(正如你所发现的那样)。这些限制主要源于如何调用函数(作为语句中的表达式,或触发器的触发方式(执行DML语句时)。
修改强>
除非声明HANDLER捕获异常/错误,否则在MySQL存储的PROCEDURE中遇到错误时,过程的执行将停止,错误将返回给调用者。
到目前为止,DML更改是提交还是回滚的,这取决于表是否为MyISAM,以及是否启用了自动提交。或者是否为该交易发出COMMIT或ROLLBACK。 DML语句是在存储过程中执行还是在过程之外执行并不重要。
答案 1 :(得分:0)
存储过程可以看作是一组要作为单个事务执行的SQL语句。
在处理并发时,事务性质很重要。
拥有存储过程的另一个好处是将访问控制应用于存储过程。