繁体   English   中英

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

[英]Execution flow, transactions and MySQL stored procedure

我想知道 MySQL 中的存储过程是否不仅仅是具有一些限制的 SQL 语句序列( http://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html )。

事务、InnoDB 表上的 DML 等有什么特别之处吗?

据我所知不是,因为我没有找到相反的东西。

编辑:

执行流程也是一个有趣的问题。

假设我有简单的以下过程并且自动提交已关闭:

CREATE PROCEDURE someproc ()
    -> BEGIN
    ->   -- exec stmt1
    ->   -- exec stmt2  <--- assume it fails!
    ->   -- exec stmt3
    -> END//

如果 stmt2 由于某种原因在执行过程中失败会发生什么?

在我看来,stmt2 更改将被回滚,但 stmt1 更改不会,并且过程的执行流程将停止,因此 stmt3 将不会执行。

MySQL 存储程序支持 SQL 语句之外的语法,例如声明变量、条件分支、循环、游标、动态 SQL 等。从这个意义上说,它不仅仅是一个 SQL 语句序列。

对 InnoDB 表或 MySQL 存储程序中的事务的 DML 语句没有什么“特别的”。 就允许的操作而言,程序是最宽松的。 FUNCTIONS 和 TRIGGERS 有一些限制(如您所见)。 限制主要源于函数如何被调用(作为语句中的表达式,或者触发器如何被触发(当 DML 语句正在执行时)。


编辑

除非声明 HANDLER 来捕获异常/错误,否则当在 MySQL 存储的 PROCEDURE 中遇到错误时,过程的执行将停止并将错误返回给调用者。

到目前为止,提交或回滚了哪些 DML 更改,这取决于表是否为 MyISAM,以及是否启用了自动提交。 或者是否为事务发出 COMMIT 或 ROLLBACK。 DML 语句是在存储过程内还是在过程外执行都没有关系。

存储过程可以看作是作为单个事务执行的一组 SQL 语句。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM