错误代码:1422。存储函数或触发器中不允许显式或隐式提交

问题描述 投票:0回答:2

我到处都看到 MySQL 存储过程可以做事务。然而当我声明我的存储函数时

create function test( a int )
returns int
MODIFIES SQL DATA
BEGIN
  START TRANSACTION ;
  update t set col='some value' where id=a ;
  COMMIT ;
  return 0 ;
END //

我明白了

错误代码:1422。存储函数或触发器中不允许显式或隐式提交。

mysql stored-procedures stored-functions
2个回答
17
投票

实际上,您不允许在存储的功能内进行交易。您只能在存储的程序内进行交易。

create procedure test( a int )
MODIFIES SQL DATA
BEGIN
  START TRANSACTION ;
  update t set col='some value' where id=a ;
  COMMIT ;
END //

要从 SP 返回值,请使用输出参数或使用 SP 中最后一个 select 语句的结果集。


0
投票

我们不能在函数中使用交易,而我们可以在过程中使用。

所以,我得到了下面同样的错误:

错误 1422 (HY000):存储函数或触发器中不允许显式或隐式提交。

因为我在函数中使用了

START TRANSACTION;
COMMIT;
的事务,如下所示:

DELIMITER $$

CREATE FUNCTION my_func() RETURNS INT 
DETERMINISTIC
BEGIN
  START TRANSACTION;
    -- Statements
  COMMIT;
END$$ 

DELIMITER ;

但是,我可以在程序中使用

START TRANSACTION;
COMMIT;
进行交易,不会出现错误,如下所示:

DELIMITER $$

CREATE PROCEDURE my_proc()
BEGIN
  START TRANSACTION;
    -- Statements
  COMMIT;
END$$

DELIMITER ;

此外,在程序中使用

BEGIN;
代替
START TRANSACTION;
会出现以下错误:

DELIMITER $$

CREATE PROCEDURE my_proc()
BEGIN
  -- START TRANSACTION;
  BEGIN; -- Here
    -- Statements
  COMMIT;
END$$

DELIMITER ;

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 ';

附近使用的正确语法
© www.soinside.com 2019 - 2024. All rights reserved.