假设我有一些 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) 只讨论修改,而不是 (例如) SELECT
s 的行锁定或隔离级别,以及 (b) 更重要的是,当用户定义的函数(可能在其中包含数据修改 DML 语句)从某个包含语句中调用。
MySQL专家可以澄清一下吗?谢谢。