提问人:gus 提问时间:5/31/2023 最后编辑:gus 更新时间:5/31/2023 访问量:57
存储函数是否回滚整个事务?,文档中是否有错误?
Does stored function roll back the entire transaction?, is there an error in the documentation?
问:
https://dev.mysql.com/doc/refman/8.0/en/commit.html
如果事务中的 SELECT 语句调用存储函数, 如果存储函数中的语句失败,则该语句滚动 返回。如果随后对事务执行 ROLLBACK,则 整个事务回滚。
您能给我举个例子来说明这部分文档吗?
根据我的理解,如果存储函数失败,整个事务将失败,而不仅仅是SELECT a_stored_function();
我很困惑,文档中有错误吗?
答:
2赞
Bill Karwin
5/31/2023
#1
create table t (
id serial primary key,
word text
);
delimiter ;;
create function f(p_v text) returns int
no sql
begin
declare v varchar(3);
set v = p_v;
return 0;
end;;
delimiter ;
start transaction;
insert into t (word) values ('bird');
select f('too long');
commit;
select * from t;
这故意导致函数中出现错误,方法是尝试将 8 个字符的字符串填充到局部变量中,即 。它太长了,所以当我们使用该参数调用函数时会导致错误:varchar(3)
ERROR 1406 (22001): Data too long for column 'v' at row 1
这会回滚在同一事务期间完成的吗?证据是当我们在提交交易后。INSERT
SELECT
结果:
select * from t;
+----+------+
| id | word |
+----+------+
| 1 | bird |
+----+------+
未回滚。只有调用有错误的函数的单个语句被回滚(“回滚”a 没有可观察到的效果)。INSERT
SELECT
P.S.:作为程序员,这种快速的概念验证测试是你应该能够自己做的事情。我认为这就是上面 RiggsFolly 的评论所要表达的。
评论
0赞
gus
5/31/2023
所以,当存储函数本身失败时,就会发生这种情况,对吧?也就是说,如果存储函数中的某个函数失败,那么整个事务就会失败,对吧?@Bill KarwinINSERT
0赞
gus
5/31/2023
我喜欢你@Bill Karwin的例子
0赞
Bill Karwin
5/31/2023
我鼓励你开发更多的测试!
1赞
gus
5/31/2023
太好了,有了这个例子,我会做得更多
评论