4

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

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

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

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

所有表访问(包括显式更新以及some_table任何读/写操作)都是单个事务的一部分吗?MyFunction()

或者

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

或者

……还有什么?

我已经通读了 MySQL 文档,但要么我遗漏了一些东西,要么在这个问题上并不清楚。它确实说,在 autocommit ON 的情况下,“一旦您执行更新(修改)表的语句,MySQL 就会将更新存储在磁盘上以使其永久化”。但是 (a) 只讨论修改,而不是 (例如) SELECTs 的行锁定或隔离级别,以及 (b) 更重要的是,当用户定义的函数(可能在其中包含数据修改 DML 语句)从某个包含语句中调用。

MySQL专家可以澄清一下吗?谢谢。

4

1 回答 1

0

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

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

话虽如此,您可以简单地为您的会话禁用自动提交,然后在更新后手动提交。

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

于 2014-09-04T09:55:16.690 回答