如何将 MySQL 中的 InnoDB 设置为快照隔离级别
Posted
技术标签:
【中文标题】如何将 MySQL 中的 InnoDB 设置为快照隔离级别【英文标题】:How to set InnoDB in MySQL to the snapshot isolation level 【发布时间】:2012-03-26 22:03:40 【问题描述】:我现在正在从事一个学校项目,该项目需要描述 mysql 在不同隔离级别方面的性能。我已经测试了 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。现在我想使用快照隔离来测试。
我知道在 InnoDB 中使用 REPEATABLE READ 的默认值时,会结合使用快照隔离,但我想知道,是否可以将隔离级别设置为仅快照隔离?我该怎么做?
【问题讨论】:
隔离级别是你提到的4。没有快照隔离级别,可以全局设置。 【参考方案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 READ
或SERIALIZABLE
)时,它才会提供一致的快照。
因此,您必须将隔离级别设置为 REPEATABLE READ
或 SERIALIZABLE
并使用上述语法启动事务。
【讨论】:
【参考方案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、PostgreSQL 和 Microsoft SQL Server(2005 年及以后)
在快照隔离中,
事务本身将成功提交只有在没有更新与自该快照以来所做的任何并发更新发生冲突时
但是 REPEATABLE READ 级别根本不这样做,尽管它使用快照。
【讨论】:
以上是关于如何将 MySQL 中的 InnoDB 设置为快照隔离级别的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MAIN mysql 数据库从 MyIsam 转换为 InnoDB
InnoDB,快照读,在RR和RC下有何差异?(很多人,以为自己懂了...)
mysql:insert插入数据过慢如何解决,设置innodb_flush_log_at_trx_commit为0就能解决