【问题标题】:In InnoDB,is all sql in the transaction?在InnoDB中,事务中的所有sql吗?
【发布时间】:2019-03-06 01:12:52
【问题描述】:

我好像有一个错误的想法:

update table_name set id=222 where id >333;

我的旧意见是没有begincommit 的单个sql 将不会启动事务。 但这似乎是错误的。


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

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

我的问题:

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

【问题讨论】:

    标签: mysql transactions innodb


    【解决方案1】:

    它将在单个事务中执行 - 除非使用 START TRANSACTIONCOMMIT 对语句进行分组(然后将忽略 autocommit 配置,无论其值如何)。 SET autocommit = 0/1 可用于即时控制隔离级别。还有一个配置选项,以便全局更改行为:

    [mysqld]
    autocommit=0
    

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

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

    【讨论】:

    • innodb中,sql必须在事务中。可以在隐式事务中,也可以在显式事务中。无论如何,必须在事务中。做对了吗?
    • @MattiaDinosaur 一般来说,它总是一个事务,01 之间的唯一区别是,它是单个语句与组合多个语句的选项。没有“对”或“错”之分,因为这几乎不取决于发表的声明——以及分组声明是否有意义。唯一真正错误的是autocommit=0,然后忘记发出COMMIT
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多