我现在正在做一个学校项目,该项目需要描述 MySQL 在不同隔离级别方面的性能。我已经测试了 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。现在我想使用快照隔离来测试东西。
我知道在 InnoDB 中使用 REPEATABLE READ 的默认值时,会结合使用快照隔离,但我想知道,是否可以将隔离级别设置为仅快照隔离?我该怎么做?
我现在正在做一个学校项目,该项目需要描述 MySQL 在不同隔离级别方面的性能。我已经测试了 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。现在我想使用快照隔离来测试东西。
我知道在 InnoDB 中使用 REPEATABLE READ 的默认值时,会结合使用快照隔离,但我想知道,是否可以将隔离级别设置为仅快照隔离?我该怎么做?
使用变量tx_isolation,您可以在本地和全局设置事务隔离。
您可以在会话中设置如下
SET tx_isolation = 'READ-COMMITTED';
您也可以全局设置它
SET GLOBAL tx_isolation = 'READ-COMMITTED';
但这会影响新的数据库连接。您仍然必须在当前会话中设置它
MySQL 中没有快照隔离级别。它对Consistent Nonlocking Reads使用快照,但这并不意味着它支持快照隔离。
根据维基百科页面,只有以下数据库支持快照隔离。
快照隔离已被多个主要数据库管理系统采用,例如SQL Anywhere、InterBase、Firebird、Oracle、PostgreSQL和Microsoft SQL Server(2005 及更高版本)
在快照隔离中,
仅当没有更新与自该快照以来所做的任何并发更新发生冲突时,事务本身才会成功提交
但是REPEATABLE READ级别根本不这样做,尽管它使用快照。