所以这是来自文档:
为单个系列隐式禁用自动提交模式 语句,使用
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;
查询来获取该信息?
答案 0 :(得分:2)
https://dev.mysql.com/doc/refman/5.7/en/commit.html说:
使用
START TRANSACTION
,在您使用COMMIT
或ROLLBACK
结束交易之前,自动提交仍会被停用。然后,自动提交模式将恢复为先前的状态。
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
无关紧要。引擎知道它在交易中(START
或BEGIN
),因此忽略了autocommit
的设置。相反,它会挂起更改,直到COMMIT
(或ROLLBACK
)。
或者你有理由相信autocommit
的价值是相关的吗? (除了SELECT @@autocommit
。)