如何设置事务隔离级别(MySQL)

How to set transaction isolation level (MySQL)

提问人:Wen Jun 提问时间:10/29/2011 最后编辑:Super Kai - Kazuya ItoWen Jun 更新时间:11/18/2023 访问量:74592

问:

如何设置 MySQL 5.1 InnoDB 的隔离级别?

通过输入:

mysql>显示变量,如 '%isola%';

为 InnoDB 设置的默认级别是可重复读取。
如何更改隔离级别?

MySQL 数据库 事务 innoDB 隔离级别

评论


答:

65赞 Niet the Dark Absol 10/29/2011 #1
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SESSION是可选的,只是将设置限制为当前会话。
将替换为您想要的级别。
READ UNCOMMITTED

https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html

评论

8赞 alexpirine 2/8/2013
为了使这个答案更加完整:您可以全局设置隔离级别,为当前会话设置隔离级别,也可以仅为下一个事务设置隔离级别,如下所述: dev.mysql.com/doc/refman/5.5/en/set-transaction.html
-2赞 atrichkov 9/18/2018 #2

我的默认隔离级别也是 REPEATABLE READ,在上面的示例中,您可以针对当前会话更改它,但如果您想完全更改它,您可以尝试使用此命令:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

在 Mysql 服务器版本上测试:5.7.23-0ubuntu0.18.04.1 (Ubuntu)

评论

3赞 GoYun.Info 2/27/2021
这是不正确的,您需要添加“GLOBAL”。不带任何 SESSION 或 GLOBAL 关键字:该语句仅适用于在会话中执行的下一个单个事务。后续事务将恢复为使用指定特征的会话值。
0赞 akostadinov 5/31/2023
@GoYun.Info ,这很有用,我一直在寻找,谢谢。
6赞 Sorter 4/25/2020 #3

将会话变量添加到连接字符串

在连接到 mysql 数据库时,只需将其添加到连接字符串中即可。

?sessionVariables=transaction_isolation='READ-COMMITTED'

您可以检查其他隔离级别的值。

评论

0赞 Andrey Doloka 3/29/2021
它可能有效,但不方便。如果您需要对特定查询进行更严格的级别,则需要具有单独的数据源。ORM(即 Hibernate 或 Batis)内部的内置事务或锁定机制存在问题,它们不能保证多实例场景中的数据一致性。另一个服务器或应用程序可能会过度连接似乎被“锁定”以进行修改的数据。
7赞 Super Kai - Kazuya Ito 9/14/2022 #4

您可以设置 4 个事务隔离级别和 4 个作用域,如下所示。*文档更详细地解释了如何设置事务隔离级别,我的回答解释了如何在MySQL中显示事务隔离级别:

使用PERSIST作用域,即使在重新启动MySQL后也不会重置事务隔离级别:

SET PERSIST TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

艺术

SET PERSIST transaction_isolation = 'READ-UNCOMMITTED';

艺术

SET @@PERSIST.transaction_isolation = 'READ-UNCOMMITTED';

使用GLOBAL作用域时,重新启动MySQL后会重置事务隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

艺术

SET GLOBAL transaction_isolation = 'READ-COMMITTED';

艺术

SET @@GLOBAL.transaction_isolation = 'READ-COMMITTED';

使用SESSION作用域时,注销MySQL后会重置事务隔离级别:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

艺术

SET SESSION transaction_isolation = 'REPEATABLE-READ';

艺术

SET @@SESSION.transaction_isolation = 'REPEATABLE-READ';

艺术

SET transaction_isolation = 'REPEATABLE-READ';

如果没有作用域,则在执行下一个单个事务后,将重置事务隔离级别:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

艺术

SET @@transaction_isolation = SERIALIZABLE;