如何将MySQL中的InnoDB设置为快照隔离级别

时间:2012-03-26 22:03:41

标签: mysql innodb snapshot-isolation

我正在开展一个学校项目,现在需要根据不同的隔离级别来描述MySQL的性能。我已经在READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE上测试了一些东西。现在,我想使用快照隔离进行测试。

据我所知,在InnoDB中使用REPEATABLE READ的默认值时,快照隔离是一起使用的,但我想知道,是否可以将隔离级别设置为仅隔离快照?我该怎么做?

3 个答案:

答案 0 :(得分:5)

没有全局快照隔离级别。来自MySQL文档,START TRANSACTION语法:

  

您也可以开始这样的交易:

START TRANSACTION WITH CONSISTENT SNAPSHOT;
     

WITH CONSISTENT SNAPSHOT选项为具有该功能的存储引擎启动一致读取。这仅适用于InnoDB。效果与从任何InnoDB表发出START TRANSACTION后跟SELECT的效果相同。见第13.6.8.2, “Consistent Nonlocking Reads”节。 WITH CONSISTENT SNAPSHOT选项不会更改当前事务隔离级别,因此仅当当前隔离级别允许一致读取时才提供一致性快照(REPEATABLE READ或{{ 1}})。

因此,您必须将隔离级别设置为SERIALIZABLEREPEATABLE READ,并使用上述语法启动您的交易。

答案 1 :(得分:1)

使用变量tx_isolation,您可以在本地和全局设置事务隔离。

您可以在会话中按如下方式设置

SET tx_isolation = 'READ-COMMITTED';

您也可以全局设置

SET GLOBAL tx_isolation = 'READ-COMMITTED';

但这会影响新的数据库连接。您仍然需要在当前会话中设置它

答案 2 :(得分:0)

MySQL中没有快照隔离级别。它使用Consistent Nonlocking Reads的快照,但这并不意味着它支持快照隔离。

根据the Wikipedia page,只有下面的数据库支持快照隔离。

  

快照隔离已被多个主要数据库管理系统采用,例如 SQL Anywhere,InterBase,Firebird,Oracle,PostgreSQL Microsoft SQL Server (2005及更高版本)

在快照隔离中,

  

只有当没有更新时,事务本身才能成功提交,这与自该快照以来所做的任何并发更新都有冲突

但是 REPEATABLE READ 级别根本不会这样做,尽管它使用快照。