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

标签 mysql transactions user-defined-functions autocommit

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

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

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

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

所有表访问(some_table 的显式更新和还有任何读/写MyFunction() 正在做)单个事务的一部分?

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

...还有别的吗?

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

MySQL 专家能否解释一下? 谢谢。

最佳答案

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

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

也就是说,您可以简单地禁用 session 的自动提交,然后在更新后手动提交。

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

关于mysql - MySQL 用户定义的函数是调用它们的语句的自动提交事务的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465236/

相关文章:

javascript - 通过Apache Pig UDF读取javascript文件

php - 创建用户聊天系统 -(PHP、MySQL、AJAX?)

php - 我想优化这个查询,用子查询创建新表 select 没问题,但问题是查询运行需要 30 分钟

c# - 会计数据库 - 存储贷方和借方?

transactions - ArangoDB 事务 - 如何防止抛出异常

MySQL 拆分字符串函数 SPLIT_STR 不适用于 LEFT JOIN。有什么问题吗?

mysql - LOAD DATA LOCAL INFILE 自定义值

java - 驱动程序 :com. mysql.jdbc.Driver@2b7374f8 为 URL 返回 null

java - 将许多语句加载到 Jena 数据集中的最有效方法是什么?

error-handling - “No matching signature”截断了BigQuery错误消息