【问题标题】:Do DMLs in a stored procedure run in a single transaction?存储过程中的 DML 是否在单个事务中运行?
【发布时间】:2013-09-30 11:27:18
【问题描述】:

我的 MySQL 5.5 服务器设置了autocommit=1

我的存储过程有几个 DML,但没有明确的事务管理。

当我从 MySQL CLI 发出 call the_procedure()autocommit 仍然是 1)时,所有过程的 DML 是否在一个事务中运行?

或者它们是否在单独的事务中运行,并在每个 DML 之后导致隐式事务提交(由于自动提交)?

【问题讨论】:

  • 除非他们故意反常,否则 MySQL 的行为可能与大多数其他 SQL 数据库相同 - 事务和存储例程是正交概念 - 单个事务可以跨越多个例程,单个例程可以创建和提交多个事务。

标签: mysql sql database stored-procedures


【解决方案1】:

如果autocommit=1,它们在单独的事务中运行。假设你定义了

CREATE TABLE test ( id int PRIMARY KEY )//

CREATE PROCEDURE sp_test_trans()
BEGIN
  INSERT INTO test (id) VALUES (1);
  INSERT INTO test (id) VALUES (2);
  ROLLBACK;
END//

如果您使用autocommit=0 运行此过程,ROLLBACK 将撤消插入。如果您使用autocommit=1 运行它,ROLLBACK 将什么也不做。 Fiddle here.

另一个例子:

CREATE PROCEDURE sp_test_trans_2()
BEGIN
  INSERT INTO test (id) VALUES (1);
  INSERT INTO test (id) VALUES (1);
END//

如果您使用autocommit=0 运行此过程,第二次插入失败将导致ROLLBACK 撤消第一次插入。如果您使用autocommit=1 运行它,第二次插入将失败,但第一次插入的效果不会撤消。

【讨论】:

    【解决方案2】:

    在以下SQL Fiddle 中完成的测试表明,当变量autocommit 为1 (TRUE) 时,未显式处理事务会单独处理。

    【讨论】:

    • 谢谢你,但我的问题更多的是关于过程中每个单独的 DML 是否存在隐式提交,而不是整个过程调用。
    【解决方案3】:

    This 让我感到惊讶,但是:

    虽然 MySQL 会自动在您的 代表当您发出 DML 语句时,您应该发出显式 在你的程序中使用 START TRANSACTION 语句来标记开始 您的交易。

    您的存储程序可能在服务器中运行 其中自动提交设置为 TRUE,并通过发出明确的 START TRANSACTION 语句确保您不会保留自动提交 在您的交易期间启用。开始交易也有帮助 通过清楚地描述您的事务范围来提高可读性 代码。

    【讨论】:

    • 谢谢,是否建议过程调用中的 DML 在一个事务中运行?
    猜你喜欢
    • 2015-03-30
    • 2010-10-30
    • 2018-12-19
    • 1970-01-01
    • 2016-08-24
    • 2013-09-02
    • 2015-01-09
    • 2023-04-07
    相关资源
    最近更新 更多