我正在开展一个学校项目,现在需要根据不同的隔离级别来描述MySQL的性能。我已经在READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE上测试了一些东西。现在,我想使用快照隔离进行测试。
据我所知,在InnoDB中使用REPEATABLE READ的默认值时,快照隔离是一起使用的,但我想知道,是否可以将隔离级别设置为仅隔离快照?我该怎么做?
答案 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}})。
因此,您必须将隔离级别设置为SERIALIZABLE
或REPEATABLE 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 级别根本不会这样做,尽管它使用快照。