我的MySQL 5.5服务器设置了autocommit=1
。
我的存储过程有几个DML但没有明确的事务管理。
当我从MySQL CLI发出call the_procedure()
时(autocommit
仍为1),是否所有程序的DML都在一个事务中运行?
或者它们是在单独的事务中运行,并在每个DML之后导致隐式事务提交(由于自动提交)?
答案 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
运行它,第二个插入将失败,但第一个插入的效果将不会被撤消。