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

标签 mysql sql transactions autocommit

所以这是来自文档:

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 变量是单个 session 的本地变量。或者,即使它显示为 1,它实际上在事务中设置为 0,但无法通过运行 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.

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

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

关于mysql - 为什么 START TRANSACTION 不会像它应该的那样隐式影响自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44904649/

相关文章:

sql - 使用间隙和孤岛查找连续的小时/日期- SQL/BigQuery

sql - Teradata 中的 DECIMAL 类型

java - 在 DAO 类中找不到标记为传播 'mandatory' 异常的事务的现有事务

php - 如何在laravel中建立角色和权限的hasManyThrough关系?

mysql - 选择要从中选择数据的表名

具有两个条件的 MySQL JOIN 语句

java - PreparedStatement.executeUpdate() 能否在 INSERT 时返回 0?

spring多事务管理器问题

java - 与注释为 @Transactional 的方法的调用者进行通信

mysql - 使用 MySQL 的远程 SSH 命令不起作用,但语句本身可以