mysql 存储函数是否回滚整个事务?,文档中是否有错误?

zsohkypk  于 2023-06-04  发布在  Mysql
关注(0)|答案(1)|浏览(317)

https://dev.mysql.com/doc/refman/8.0/en/commit.html
如果事务中的SELECT语句调用存储函数,并且存储函数中的语句失败,则该语句回滚。如果随后对事务执行ROLLBACK,则整个事务回滚。
你能给予我一个关于那部分文档的例子吗?
根据我的理解,如果存储的函数失败,整个事务都会失败,而不仅仅是SELECT a_stored_function();
我很困惑,文档中是否有错误?

jc3wubiy

jc3wubiy1#

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 |
+----+------+

INSERT未回滚。仅回滚了调用带有错误的函数的单个语句(“回滚”SELECT没有明显的效果)。
P.S.:这种快速的概念验证测试是你作为程序员应该能够自己做的事情。我想这就是上面RiggsFolly的评论所指的。

相关问题