gpt4 book ai didi

mysql - 如何在事务中包装 mysql 存储函数

转载 作者:行者123 更新时间:2023-11-29 03:09:14 26 4
gpt4 key购买 nike

DROP FUNCTION IF EXISTS my_func;
DELIMITER ||
CREATE FUNCTION my_func(arg_id INT) RETURNS VARCHAR(200)
BEGIN
DECLARE local_id INT;
DECLARE local_name VARCHAR(200);
START TRANSACTION; /* <-- this is allowed */
SELECT id, name
INTO local_id, local_name
FROM table
WHERE id = arg_id
FOR UPDATE;
SELECT my_other_function(local_name) INTO local_name;
UPDATE table SET name = local_name;
COMMIT; /* <-- this is not allowed
and yields an "Explicit or
implicit commit is not
allowed..." error */
RETURN local_name;
END||
DELIMITER ;

return 语句是隐式提交吗?

您应该如何确保某个功能作为事务运行?

将其包装在交易中?

START TRANSACTION;
SELECT my_func(33); /* <-- no transaction statements inside the function */
COMMIT;

在函数内部启动事务并提交?

SELECT my_func(33); /* <-- contains only the START TRANSACTION line */
COMMIT;

此外,我研究了这个问题并发现了一些信息,内容大致如下:“存储函数中的语句不能保证按照声明的顺序执行,这会使二进制日志记录(和隐式复制)不一致”。

最佳答案

我之前不得不使用它并且它对我有用:

选项 1

SET autocommit = {0 | 1}

完成你想做的事情后,你可以重新启用它或调用显式提交。

选项 2要为单个语句系列隐式禁用自动提交模式,请使用 START TRANSACTION 语句:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

我从 mysql 网站本身得到这个 - MySQL


对于您的情况,我认为在函数之前将 autocommit 设置为 false 就可以解决问题(如果您查看上面的描述,启动事务也是一样的)。这样,在交易期间,您的函数不会自动提交。

关于mysql - 如何在事务中包装 mysql 存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com