执行流程,事务和MySQL存储过程

时间:2016-05-01 17:30:35

标签: mysql stored-procedures innodb

我想知道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将不会执行。

2 个答案:

答案 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语句。

在处理并发时,事务性质很重要。

拥有存储过程的另一个好处是将访问控制应用于存储过程。