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

39

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

输入以下命令:

mysql> show variables like '%isola%';

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

4个回答

65

8
为了使这个回答更加完整:您可以全局设置隔离级别,为当前会话设置,或仅为下一个事务设置,具体文档请参考这里:http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html。 - alexpirine

7
你可以使用下面显示的4个事务隔离级别4个范围。*您可以在13.3.7 SET TRANSACTION语句上查看更多详细信息。
使用PERSIST范围,即使重新启动MySQL事务隔离级别也不会重置:
SET PERSIST TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

或者:

SET PERSIST transaction_isolation = 'READ-UNCOMMITTED';

使用GLOBAL范围,在重新启动MySQL后,事务隔离级别将被重置:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

或者:

SET GLOBAL transaction_isolation = 'READ-COMMITTED';

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

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

或者:

SET SESSION transaction_isolation = 'REPEATABLE-READ';

没有作用域时,在执行下一个单个事务后,事务隔离级别将被重置。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

或者:

SET transaction_isolation = 'SERIALIZABLE';

6

向连接字符串添加会话变量

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

?sessionVariables=transaction_isolation='READ-COMMITTED'

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


可能会起作用,但不方便。如果您需要在特定查询上有更严格的级别,则需要拥有单独的数据源实例。ORM内置的事务或锁定机制(如Hibernate或Batis)存在问题,它们不能保证在多实例场景下的数据一致性。另一个服务器或应用程序可能会覆盖看似已被“锁定”以进行修改的数据。 - Andrey Doloka

-2

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

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

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


3
这是不正确的,你需要添加“GLOBAL”。没有SESSION或GLOBAL关键字:该语句仅适用于会话中执行的下一个单个事务。随后的事务将恢复使用指定特性的会话值。 - GoYun.Info
@GoYun.Info,非常有用,我一直在寻找这个,谢谢。 - akostadinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接