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

标签 mysql stored-procedures innodb

我想知道 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 表上的 DML 语句或 MySQL 存储程序中的事务没有什么“特别”的。就允许的操作而言,程序是最宽松的。 FUNCTIONS 和 TRIGGERS 有一些限制(如您所见)。这些限制主要源于函数的调用方式(作为语句中的表达式,或者触发器的触发方式(在执行 DML 语句时)。


编辑

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

至于提交或回滚哪些 DML 更改,这取决于表是否为 MyISAM,以及是否启用了自动提交。或者是否为事务发出了 COMMIT 或 ROLLBACK。 DML 语句是在存储过程内还是在过程外执行并不重要。

关于mysql - 执行流程、事务和MySQL存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969692/

相关文章:

mysql - 这个 mysql 代码产生语法错误,我不知道为什么

sql - 错误 PLS-00103 : Encountered the symbol "DECLARE"?

mysql - InnoDB/MySQL - 新事务在 SELECT 上使用旧数据而不是返回更新后的数据

mysql - 使用 ALTER TABLE 命令在现有表中添加当前日期和时间为 : Not Working 的列

mysql - Laravel 5.3 如何进行多重连接

php - 使用 JSON 和 cURL 通过 PHP 发布到 Dreamfactory API

c# - 通过 ODBC 执行参数化 SQL 存储过程

sql - 在 SQL 中复制父子结构

mysql select with joins with foreign keys 当使用提供的id时

两个相同查询(不同参数)的MySQL InnoDB死锁问题