为什么START TRANSACTION不会像它应该的那样隐式地影响自动提交

时间:2017-07-04 11:22:12

标签: mysql sql transactions autocommit

所以这是来自文档:

  

为单个系列隐式禁用自动提交模式   语句,使用START TRANSACTION语句:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

从我的理解来看,与使用BEGIN不同;命令不应该将自动提交设置为0,START TRANSACTION应该将其设置为0.

现在,如果我这样做(在我开始交易之后):

select @@autocommit;

我得到值1。

为什么即使我使用START TRANSACTION命令仍然启用自动提交?我认为autocommit变量是单个会话的本地变量。或者即使它说1,它实际上在一个事务中设置为0,但只是无法通过运行SELECT @@autocommit;查询来获取该信息?

2 个答案:

答案 0 :(得分:2)

https://dev.mysql.com/doc/refman/5.7/en/commit.html说:

  

使用START TRANSACTION,在您使用COMMITROLLBACK结束交易之前,自动提交仍会被停用。然后,自动提交模式将恢复为先前的状态。

autocommit变量的值是MySQL存储"之前的状态"这样它就可以在你的交易完成后恢复它。

您可以通过实验确认是否遵循此行为。在事务中进行更改,然后回滚事务。

CREATE TABLE test.MyTable (mycolumn TEXT);

START TRANSACTION;
INSERT INTO test.MyTable (mycolumn) VALUES ('Thing 1');
ROLLBACK;

SELECT * FROM test.MyTable; -- finds the row is gone

请注意,您所做的更改已回滚。如果自动提交已经生效,那么回滚将永远不会起作用,因为每个语句一旦执行就会提交。

答案 1 :(得分:1)

我建议@@autocommit无关紧要。引擎知道它在交易中(STARTBEGIN),因此忽略了autocommit的设置。相反,它会挂起更改,直到COMMIT(或ROLLBACK)。

或者你有理由相信autocommit的价值是相关的吗? (除了SELECT @@autocommit。)