假设我有一些InnoDB(或其他事务感知)表,以及在计算其返回值的过程中从这些表读取或写入的用户定义函数MyFunction()
。
进一步假设启用了自动提交(即MySQL以默认方式运行)。
如果我发出(例如)声明:
UPDATE some_table SET col_a = MyFunction(col_b) WHERE col_c='apples';
是所有表访问(some_table
和的显式更新 1>}正在进行的任何读/写)部分单笔交易?
OR
MyFunction()
中的各个DML语句在执行时是否自动提交...然后将MyFunction()
的缓存更改作为另一个单独的事务后应用?
OR
......别的什么?
我已经阅读了MySQL文档,但要么我错过了某些内容,要么就此问题并不清楚。它确实说自动提交ON,"只要你执行一个更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化#34;。但是(a)只讨论修改,而不是(例如)some_table
的行锁定或隔离级别,以及(b)更重要的是,它没有说明单个"陈述的重要性。 #34;,当从某个包含语句中调用用户定义的函数(可能包含其中包含数据修改DML语句)时。
请问某位MySQL专家请澄清一下吗? 感谢。
答案 0 :(得分:0)
MyFunction()的每次调用都将被视为一个单独的查询并自行提交。
即使您在some_table上回滚更新,如果启用了自动提交,MyFucntion所做的更改也会保留。
话虽如此,您只需为会话禁用自动提交,然后在更新后手动提交。
编辑:使用函数这种方式非常慢。对于每行更新,该函数将被调用一次。在更新上计算MyFunction可能会更快,并且在单独的updae语句中完成MyFunction所做的所有更新。