【问题标题】:Can I turn transactions off in MySQL/InnoDB?我可以在 MySQL/InnoDB 中关闭事务吗?
【发布时间】:2011-09-30 11:45:12
【问题描述】:

我有一个 Django 应用程序,其中 InnoDB 中默认的“REPEATABLE READ”事务隔离级别导致不同进程对数据的视图与数据库中当前的数据视图不同。

例如流程 1 进行了更改,但流程 2 没有看到它。

我不需要应用程序中的事务完整性;我可以完全关闭事务,以便所有执行 SELECT 的进程看到相同的数据吗?

这样做有什么缺点吗?

这就是“READ UNCOMMITTED”的意思吗?

欢迎指点 雷切尔

【问题讨论】:

  • 如果进度 1 进行了更改,如果它希望进程 2 看到它,它应该提交此更改。你为什么要离开这个?
  • 因为我只是不想开启事务管理。我想要速度而不是交易完整性。我可以花时间调试为什么 Django 在我认为不应该的情况下保持事务处于打开状态;但由于我不关心交易,这似乎不是我时间的最佳利用方式。我正在移动 NoSQL 数据库中的一半数据;交易对我来说真的不重要。因此问题是——我可以把它关掉吗?

标签: mysql innodb


【解决方案1】:

我建议您将 InnoDB 表转换为 myISAM。如果您的标准是速度,那么您通过使用面向事务的表类型 (InnoDB) 并只是禁用事务而浪费了很多潜力。如果您只是将表格转换为 myISAM,您将获得很多收益。它的设计考虑到了缺少事务,同时仍然能够锁定更改(即表锁)。

干净

ALTER TABLE table_name ENGINE = MyISAM;

可以解决单个表的问题,转储、更改类型和加载表也可以解决问题。

【讨论】:

  • 你确定是ALTER TABLE table_name ENGINE = MyISAM;
  • 感谢您的建议。这是否意味着我只有表级锁定?我认为这就是我们最初从 MyISAM 迁移到 InnoDB 的原因
  • 是的,就是这个意思。但是您不希望事务锁定行,或者至少这是我在您的原始帖子中读到的内容。如果应用程序在针对 MyISAM 表运行时没有专门使用表锁定,您将得到您想要的:高性能,无事务开销。
【解决方案2】:

自动提交在 InnoDB 中默认是开启的。事务仍然用于更新(这是必要的),但它们会在每个语句之后立即提交。

READ UNCOMMITTED 隔离级别允许事务读取已由其他事务写入但尚未提交的行。但是,如果您没有明确使用事务并且启用了自动提交,则这一点无关紧要。

不幸的是,我对 Django 不是很熟悉,但是从the documentation 我看到了:

如何全局停用事务管理

控制狂可以通过设置完全禁用所有事务管理 在 Django 设置文件中将 DISABLE_TRANSACTION_MANAGEMENT 设置为 True。

希望对您有所帮助。

【讨论】:

  • 感谢您的建议,但如果我使用 DISABLE_TRANSACTION_MANAGEMENT 设置,那么我必须在各处编写大量手动提交代码,这会使生活变得更糟。我认为问题在于 Django 正在打开一个事务,但只在插入/更新时进行提交,但由于 InnoDB 默认情况下执行 REPEATED_READ,如果在读取过程中没有任何更改,它将保持旧的陈旧数据回来。我会尝试 READ UNCOMMITTED,看看是否有帮助。
  • @Rachel 您也可以尝试 READ COMMITED - 它比默认的可重复读取更快,并且事务将看到在执行特定查询时提交的任何数据(即使是查询也可以重复读取在事务开始 10 秒后执行的会看到一个快照,在事务开始时拍摄,而不是查询)。
  • 抱歉 Rachel,没有阅读下一行中提到的警告。我会确认这不会禁用任何 BEGIN TRANSACTION 语句。如果DISABLE_TRANSACTION_MANAGEMENT 导致事务没有被显式启动,那么你就没有问题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多