执行流程、事务和 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 语句没有任何内容 "special"。就允许的操作而言,程序是最宽松的。 FUNCTIONS 和 TRIGGERS 有一些限制(如您所见)。这些限制主要源于函数的调用方式(作为语句中的表达式,或者触发器的触发方式(当执行 DML 语句时。)
编辑
除非 HANDLER 声明为捕获 exception/error,否则当在 MySQL 存储过程中遇到错误时,过程停止执行并将错误返回给调用者。
至于提交或回滚哪些 DML 更改,这取决于表是否为 MyISAM,以及是否启用了自动提交。或者是否为事务发出了 COMMIT 或 ROLLBACK。 DML 语句是在存储过程内还是在过程外执行并不重要。
存储过程可以看作是一组 SQL 语句,作为一个事务执行。
处理并发时事务性质很重要。
拥有存储过程的另一个好处是对存储过程应用访问控制。
我想知道 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 语句没有任何内容 "special"。就允许的操作而言,程序是最宽松的。 FUNCTIONS 和 TRIGGERS 有一些限制(如您所见)。这些限制主要源于函数的调用方式(作为语句中的表达式,或者触发器的触发方式(当执行 DML 语句时。)
编辑
除非 HANDLER 声明为捕获 exception/error,否则当在 MySQL 存储过程中遇到错误时,过程停止执行并将错误返回给调用者。
至于提交或回滚哪些 DML 更改,这取决于表是否为 MyISAM,以及是否启用了自动提交。或者是否为事务发出了 COMMIT 或 ROLLBACK。 DML 语句是在存储过程内还是在过程外执行并不重要。
存储过程可以看作是一组 SQL 语句,作为一个事务执行。
处理并发时事务性质很重要。
拥有存储过程的另一个好处是对存储过程应用访问控制。