与可以显式启动和提交事务的存储过程不同,存储函数不能包含“执行显式或隐式提交或回滚的语句”。文档对此非常清楚,在解释为什么禁止它时,它变得有点模糊,只是声明 SQL“标准”不需要它并将其留给供应商。 但是,我想知道,在其上下文中调用时,
SELECT
或 DO
等命令的原子性是否会影响存储函数?
在这种情况下,存储函数中包含的命令被视为一个事务还是每个事务被视为单独的事务(如存储过程,没有START TRANSACTION
)?
第一个似乎是正确的,它甚至可以解释为什么禁止在函数体内提交事务,而且如果出现问题,那么每次更改都可以通过SELECT
或DO
自动回滚,这样保持“全有或全无”的方法,但它比官方直接的答案更隐含,文档应该涵盖这个问题,但它没有。
[纯属理论问题]