我想知道MySQL中的存储过程是否不仅仅是具有某些限制的SQL语句序列(http://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html)。
InnoDB表上的事务、DML有什么特别之处吗?
据我所知,它不是,因为我没有发现相反的。
编辑:
执行流程也是一个有趣的问题。
假设我有以下简单的过程,并且自动提交为off:
CREATE PROCEDURE someproc ()
-> BEGIN
-> -- exec stmt1
-> -- exec stmt2 <--- assume it fails!
-> -- exec stmt3
-> END//如果stmt2因某些原因在执行过程中失败,会发生什么情况?
在我看来,stmt2更改将是回滚的,但是stmt1更改不会发生,并且过程的执行流程将停止,因此不会执行stmt3。
发布于 2016-05-01 17:44:04
MySQL存储的程序支持SQL语句之外的语法,例如声明变量、条件分支、循环、游标、动态SQL等等。从这个意义上说,它不仅仅是一系列SQL语句。
对于InnoDB表或MySQL存储程序中的事务,DML语句没有什么“特殊”。在允许的选择方面,程序是最宽松的。函数和触发器有一些限制(正如您所发现的)。这些限制主要来自函数如何被调用(作为语句中的表达式,或者触发器是如何触发的(当DML语句正在执行时)。
编辑
除非声明处理程序以捕获异常/错误,否则当在MySQL存储过程中遇到错误时,该过程的执行将停止,错误将返回给调用方。
就DML更改提交或回滚而言,这取决于表是否为MyISAM,以及是否启用了自动提交。或是否为事务发出了提交或回滚。DML语句是在存储过程中执行还是在过程之外执行并不重要。
发布于 2016-05-01 17:44:52
存储过程可以看作是作为一个事务执行的一组SQL语句。
事务性质在处理并发性时非常重要。
拥有存储过程的另一个好处是将访问控制应用于存储过程。
https://stackoverflow.com/questions/36969692
复制相似问题