为什么 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
无关紧要。引擎知道它处于事务中(START
或 BEGIN
),因此它会忽略 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
请注意,您所做的更改已回滚。如果自动提交已经生效,那么回滚将永远不会起作用,因为每个语句都会在执行后立即提交。
所以这是来自文档:
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
无关紧要。引擎知道它处于事务中(START
或 BEGIN
),因此它会忽略 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 withCOMMIT
orROLLBACK
. 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
请注意,您所做的更改已回滚。如果自动提交已经生效,那么回滚将永远不会起作用,因为每个语句都会在执行后立即提交。