我的 MySQL 5.5 服务器已设置autocommit=1
.
我的存储过程有几个 DML,但没有明确的事务管理。
当我call the_procedure()
从 MySQL CLI 发出(autocommit
仍然是 1)时,所有过程的 DML 是否在一个事务中运行?
还是它们在单独的事务中运行,并在每个 DML 之后导致隐式事务提交(由于自动提交)?
我的 MySQL 5.5 服务器已设置autocommit=1
.
我的存储过程有几个 DML,但没有明确的事务管理。
当我call the_procedure()
从 MySQL CLI 发出(autocommit
仍然是 1)时,所有过程的 DML 是否在一个事务中运行?
还是它们在单独的事务中运行,并在每个 DML 之后导致隐式事务提交(由于自动提交)?
这让我感到惊讶,但是:
虽然当你发出 DML 语句时 MySQL 会自动代表你启动一个事务,你应该在你的程序中发出一个显式的 START TRANSACTION 语句来标记你的事务的开始。
您的存储程序可能在自动提交设置为 TRUE 的服务器中运行,并且通过发出明确的 START TRANSACTION 语句,您可以确保在事务期间自动提交不会保持启用状态。START TRANSACTION 还通过清楚地描述事务代码的范围来提高可读性。
如果 .它们在单独的事务中运行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
不会执行任何操作。在这里拉小提琴。
另一个例子:
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
,第二次插入将失败,但第一次插入的效果不会被撤消。
在以下SQL Fiddle中完成的测试表明,当变量autocommit
为 1 (TRUE) 时,未显式处理事务将单独处理。