gpt4 book ai didi

mysql - 默认情况下,MySQL 5.7 支持每个查询作为一个事务吗?

转载 作者:行者123 更新时间:2023-11-29 18:29:29 30 4
gpt4 key购买 nike

我有一个系统,它使用 Perl 脚本将数据从 xml 文件加载到 MySQL 数据库中以生成一些报告。以前它使用 MySQL 5.1,现在我需要升级到 MySQL 5.7。

在这两种情况下,我都有 mysql auto-commit=1(仅作为默认配置)和 perl auto-commit=0(在运行 sql 之前的脚本中 - 仅适用于具有显式提交语句的插入)

升级后,将以 InnoDB 作为默认引擎创建新表,并且由于我不需要事务管理并将表从 MyISAM 更改为 InnoDB,因此我在 .my 中使用以下标志抑制了使用.cnf
default-storage-engine=MyISAM
disabled-storage-engines=InnoDB
进行上述更改后,我能够实现 MyISAM 引擎的表创建,但看起来事务管理仍然处于某种启用状态(这是我的猜测),并且我面临以下问题

mysql> show full processlist;
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+
| 14 | test | localhost | REGRESS | Sleep | 17 | | NULL |
| 15 | test | localhost | REGRESS | Query | 16 | Waiting for table metadata lock | OPTIMIZE TABLE TEST.SOURCE |
| 16 | test | localhost | NULL | Query | 0 | starting | show full processlist |
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+

我确定这不是因为表锁定的唯一方法,因为我在 MySQL 5.1 中没有遇到过这个问题,我使用了“skip-innodb”选项并且默认存储引擎是 MyISAM。

我无法获得任何官方文档说明 MySQL 5.7 中默认启用事务。如果有人能证实这一点,那就太好了。即使在使用 MyISAM 引擎使用表(如我的情况)之后,看起来它仍然将每个查询作为一个事务,这就是我怀疑的问题。

如果需要更多信息,请告诉我。

有什么方法可以通过设置一些环境变量来禁用 MySQL 5.7 中的事务管理吗?

除了上述标志设置之外,我们还有什么方法可以禁用 InnoDB 引擎吗?

提前致谢。

最佳答案

Metadata locking ,在 MySQL 5.5 中引入(这就是它无法干扰 5.1 中的脚本的原因),可防止在不同事务处于事件状态时进行 ddl 更改:

The server achieves this by acquiring metadata locks on tables used within a transaction and deferring release of those locks until the transaction ends. A metadata lock on a table prevents changes to the table's structure. This locking approach has the implication that a table that is being used by a transaction within one session cannot be used in DDL statements by other sessions until the transaction ends.

对于您的情况,请务必注意,这还包括 MyISAM 表,即使它们不是事务性的:

This principle applies not only to transactional tables, but also to nontransactional tables.

因此,即使您在事务中“仅”使用 MyISAM 表,在事务结束之前也无法更改该表。事务可以通过启动事务或禁用自动提交来启动。自动提交是 enabled by default ,效果是

In autocommit mode, each statement is in effect a complete transaction, so metadata locks acquired for the statement are held only to the end of the statement.

因此,虽然 MySQL 5.7 中默认情况下未启用事务,但如果禁用自动提交(这就是您在脚本中执行的操作),事务将隐式启动。虽然此事务对 MyISAM 表上的查询没有影响,但从 MySQL 5.5 开始,它仍然会添加元数据锁,从而对 ddl 语句(在其他 session 中)产生影响。如果您不想这样做,请不要禁用自动提交。

你不能做的(如果这就是你想要的)是通过禁用 InnoDB 来完全禁用“事务功能”。 InnoDB是一个存储引擎。与 MyISAM 相比,它支持事务,但它不是事务功能本身 - 尽管肯定存在很大的相互依赖关系,因为如果没有支持事务的主存储引擎,该功能就没有那么大的值(value)。 transactional conceptmysql 的组成部分并且无法禁用 - 这是非常重要的,以至于文档(据我所知)甚至没有明确说明这一点。

关于mysql - 默认情况下,MySQL 5.7 支持每个查询作为一个事务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45833446/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com