1

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

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

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

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

4

3 回答 3

2

让我感到惊讶,但是:

虽然当你发出 DML 语句时 MySQL 会自动代表你启动一个事务,你应该在你的程序中发出一个显式的 START TRANSACTION 语句来标记你的事务的开始。

您的存储程序可能在自动提交设置为 TRUE 的服务器中运行,并且通过发出明确的 START TRANSACTION 语句,您可以确保在事务期间自动提交不会保持启用状态。START TRANSACTION 还通过清楚地描述事务代码的范围来提高可读性。

于 2013-09-25T02:46:56.887 回答
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=0ROLLBACK则将撤消插入。如果您使用 运行它autocommit=1,则ROLLBACK不会执行任何操作。在这里拉小提琴

另一个例子:

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

于 2013-09-27T10:47:08.640 回答
0

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

于 2013-09-25T10:11:29.220 回答