我可以在 MySQL/InnoDB 中关闭事务吗?

发布于 2024-12-07 19:31:26 字数 256 浏览 1 评论 0原文

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

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

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

这样做有什么缺点吗?

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

欢迎任何指点 雷切尔

I have a Django app where the default "REPEATABLE READ" transaction isolation level in InnoDB is causing different processes to have different views of the data than that current in the database.

e.g. Process 1 has made a change but Process 2 isn't seeing it.

I don't need transactional integrity in the app; can I just turn off transactions altogether so that all processes doing a SELECT see the same data?

Any downside to doing this?

Is this what is meant by "READ UNCOMMITTED"?

Any pointers welcome
Rachel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一绘本一梦想 2024-12-14 19:31:26

我建议您将 InnoDB 表转换为 myISAM。如果您的标准是速度,那么您通过使用面向事务的表类型(InnoDB)并仅禁用事务来浪费大量潜力。如果您只是将表转换为 myISAM,您将会获益匪浅。它的设计考虑到缺乏事务,同时仍然能够锁定更改(即表锁)。

对于单个表来说,清理

ALTER TABLE table_name ENGINE = MyISAM;

可以达到这个目的,转储、更改类型和加载表也可以达到这个目的。

I'd suggest that you just convert the InnoDB tables to myISAM. If your criteria is speed, you are wasting alot of potential by using a transaction oriented table type (InnoDB) and just disabling transactions. You would gain alot if you just converted the tables to myISAM. It's designed with lack of transactions in mind, while still being able to lock changes (i.e. table locks).

A clean

ALTER TABLE table_name ENGINE = MyISAM;

can do the trick for a single table, dumping, changing type and loading the table does the trick as well.

爱本泡沫多脆弱 2024-12-14 19:31:26

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

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

不幸的是,我对 Django 不太熟悉,但是来自 文档 我看到:

如何全局停用事务管理

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

希望有帮助。

Autocommit is on by default in InnoDB. Transactions are still used for updates (which is necessary), but they are committed immediately after each statement.

The READ UNCOMMITTED isolation level allows a transaction to read rows which have been written by other transactions but haven't yet been committed. This point is irrelevant however if you're not explicitly using transactions and autocommit is on.

Unfortunately, I'm not too familiar with Django, but from the documentation I see:

How to globally deactivate transaction management

Control freaks can totally disable all transaction management by setting
DISABLE_TRANSACTION_MANAGEMENT to True in the Django settings file.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文