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

Why does START TRANSACTION doesn't affect on autocommit implicitly as it should

所以这是来自文档:

To disable autocommit mode implicitly for a single series of statements, use the START TRANSACTION statement:

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; 查询获得该信息?

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

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

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

With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.

自动提交变量的值是 MySQL 存储 "previous state" 的位置,以便它可以在您的交易完成后恢复到它。

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

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

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