MySQL用户定义的函数是调用它们的语句的自动提交事务的一部分吗?

时间:2014-08-23 18:43:57

标签: mysql transactions user-defined-functions autocommit

假设我有一些InnoDB(或其他事务感知)表,以及在计算其返回值的过程中从这些表读取或写入的用户定义函数MyFunction()

进一步假设启用了自动提交(即MySQL以默认方式运行)。

如果我发出(例如)声明:

UPDATE some_table SET col_a = MyFunction(col_b) WHERE col_c='apples';

所有表访问(some_table的显式更新 }正在进行的任何读/写)部分单笔交易

OR

MyFunction()中的各个DML语句在执行时是否自动提交...然后将MyFunction()的缓存更改作为另一个单独的事务后应用?

OR

......别的什么?

我已经阅读了MySQL文档,但要么我错过了某些内容,要么就此问题并不清楚。它确实说自动提交ON,"只要你执行一个更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化#34;。但是(a)只讨论修改,而不是(例如)some_table的行锁定或隔离级别,以及(b)更重要的是,它没有说明单个"陈述的重要性。 #34;,当从某个包含语句中调用用户定义的函数(可能包含其中包含数据修改DML语句)时。

请问某位MySQL专家请澄清一下吗? 感谢。

1 个答案:

答案 0 :(得分:0)

MyFunction()的每次调用都将被视为一个单独的查询并自行提交。

即使您在some_table上回滚更新,如果启用了自动提交,MyFucntion所做的更改也会保留。

话虽如此,您只需为会话禁用自动提交,然后在更新后手动提交。

编辑:使用函数这种方式非常慢。对于每行更新,该函数将被调用一次。在更新上计算MyFunction可能会更快,并且在单独的updae语句中完成MyFunction所做的所有更新。