【发布时间】:2021-06-02 17:24:51
【问题描述】:
假设您有一个如下所示的存储过程:
CREATE OR REPLACE
PROCEDURE usp_do_something (
IN param1 INT,
IN param2 INT,
IN param3 INT
)
MODIFIES SQL DATA
BEGIN
START TRANSACTION;
INSERT `table1` ( `ID` ) VALUES (param1);
INSERT `table2` ( `ID` ) VALUES (param2);
INSERT `table3` ( `ID` ) VALUES (param3);
COMMIT;
END;
然后使用一组参数值调用存储过程,这会导致INSERT 操作之一失败,从而引发SQLEXCEPTION。
此示例中没有明确的ROLLBACK 命令。测试表明,当COMMIT; 语句之前出现SQLEXCEPTION 时,事务未提交。存储过程结束时事务是否隐式回滚?或者事务是否会一直挂起,直到发生某种超时?这会导致存储过程在失败后保持锁定一段时间吗?
我知道我可以使用DECLARE HANDLER 在失败时显式触发ROLLBACK,如this question 中所述,但我找不到任何文档描述如果存储过程事务在到达@987654329 之前失败,MariaDB 会做什么没有任何明确的ROLLBACK 的@ 语句。
是否有 MariaDB/MySQL 日志或事务状态表可供我查看,以了解服务器对该事务执行的操作?
【问题讨论】:
标签: mysql stored-procedures transactions mariadb