在InnoDB中,所有的sql都在事务中吗?

Mat*_*aur 2 mysql innodb transactions

我似乎\xe3\x80\x80有一个错误的想法:

\n\n
update table_name set id=222 where id >333;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的旧观点是上面的单个sql没有begin并且commit不会启动事务。\n但这似乎是错误的。

\n\n
\n\n

但是当我阅读mysql文档时,我发现似乎所有sql都会在一个事务中。如果你不显式使用beginand commit,它将在InnoDB中隐式启动事务。

\n\n
\n

在 InnoDB 中,所有用户活动都发生在事务内。如果启用自动提交模式,则每个 SQL 语句都会自行形成一个事务。默认情况下,MySQL 在启用自动提交的情况下为每个新连接启动会话,因此如果该语句未返回错误,MySQL 会在每个 SQL 语句后执行提交。如果语句返回错误,则提交或回滚行为取决于错误。请参见第 14.21.4 节,\xe2\x80\x9cInnoDB 错误处理\xe2\x80\x9d。

\n
\n\n

我的问题 :

\n\n

是所有的sql都会在事务中执行,无论你是否使用begincommit显式。

\n

Mar*_*ler 5

它将在单个事务中执行- 除非使用START TRANSACTION&分组语句COMMITautocommit然后配置将被忽略,无论它的值是什么)。SET autocommit = 0/1可用于动态控制隔离级别。还有一个配置选项,以便全局更改行为:

[mysqld]
autocommit=0
Run Code Online (Sandbox Code Playgroud)

“服务器系统变量”的文档详细解释了它:

模式autocommit。如果设置为1,则对表的所有更改都会立即生效。如果设置为0,您必须使用COMMIT来接受交易或ROLLBACK取消交易。如果autocommit0并且您将其更改为1,MySQL 会自动执行COMMIT任何打开的事务。开始事务的另一种方法是使用START TRANSACTIONorBEGIN语句。

  • @MattiaDinosaur 一般来说,它始终是一个事务,“0”和“1”之间的唯一区别是,它是单个语句与对多个语句进行分组的选项。没有“对”或“错”之分,因为这几乎取决于所发表的声明 - 以及分组声明是否有意义。唯一真正错误的是“autocommit=0”,然后忘记发出“COMMIT”。 (2认同)