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;
我也研究了这个问题,并发现了一些信息,说的是:“存储函数中的语句不能保证以声明的顺序执行,这可能使二进制日志记录(和隐式复制)不一致”。
答案 0 :(得分:1)
我以前必须使用它,它对我有用:
选项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(如果您查看上面的描述,启动事务是一回事)。这样,在事务期间,你的函数就不会自动提交。