存储过程中的DML是否在单个事务中运行?

时间:2013-09-25 02:39:28

标签: mysql sql database stored-procedures

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

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

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

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

3 个答案:

答案 0 :(得分:1)

This让我感到惊讶,但是:

  

虽然MySQL会自动启动你的交易   代表您发出DML语句时,应该发出明确的声明   在程序中START TRANSACTION语句标记开头   你的交易。

     

您的存储程序可能会在服务器中运行   哪个自动提交设置为TRUE,并通过发出明确的START   TRANSACTION语句确保不保留自动提交   在交易期间启用。 START TRANSACTION也有助于   通过明确界定交易范围的可读性   代码。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果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运行它,第二个插入将失败,但第一个插入的效果将不会被撤消。