【问题标题】:How to set InnoDB in MySQL to the snapshot isolation level如何将 MySQL 中的 InnoDB 设置为快照隔离级别
【发布时间】:2012-03-26 22:03:40
【问题描述】:

我现在正在从事一个学校项目,该项目需要描述 MySQL 在不同隔离级别方面的性能。我已经测试了 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。现在我想使用快照隔离来测试。

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

【问题讨论】:

  • 隔离级别是你提到的4。没有快照隔离级别,可以全局设置。

标签: mysql innodb snapshot-isolation


【解决方案1】:

没有全局快照隔离级别。来自 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 READSERIALIZABLE)时,它才会提供一致的快照。

因此,您必须将隔离级别设置为 REPEATABLE READSERIALIZABLE 并使用上述语法启动事务。

【讨论】:

    【解决方案2】:

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

    你可以在会话中设置如下

    SET tx_isolation = 'READ-COMMITTED';
    

    你也可以全局设置

    SET GLOBAL tx_isolation = 'READ-COMMITTED';
    

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

    【讨论】:

      【解决方案3】:

      MySQL 中没有快照隔离级别。 Consistent Nonlocking Reads 使用快照,但并不代表它支持快照隔离。

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

      快照隔离已被多个主要数据库管理系统采用,例如 SQL Anywhere、InterBase、Firebird、Oracle、PostgreSQLMicrosoft SQL Server(2005 年及以后)

      在快照隔离中,

      事务本身将成功提交只有在没有更新与自该快照以来所做的任何并发更新发生冲突时

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

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 2016-01-18
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多