以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思:
事务隔离级别
SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。事务隔离其实就是为了解决上面提到的 脏读、不可重复读、幻读 这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读取未提交 | 可能 | 可能 | 可能 |
读取已提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。
如何设置隔离级别
我们可以通过一下语句查看当前数据库的隔离级别,通过下面语句可以看出我使用的 MySQL 的隔离级别是 REPEATABLE-READ,也就是可重复读,这也是 MySQL 的默认级别。
show variables like "transaction_isolation";
稍后,我们要修改数据库的隔离级别,所以先了解一下具体的修改方式。
修改隔离级别的语句是:
set [作用域] transaction_isolation level [事务隔离级别];
set [session | global] transaction isolation level [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE];
其中作用域可以是 session 或者 global ,global 是全局的,而 session 只针对当前回话窗口。隔离级别是 READ UNCOMMITTED 或者 READ COMMITTED 或者 REPEATABLE READ 或者 SERIALIZABLE 这四种,不区分大小写。
比如下面这个语句的意思是设置全局隔离级别为读取已提交级别。
修改全局隔离级别为读取已提交
set global transaction isolation level read committed;
修改当前会话隔离级别为读取已提交
set session transaction isolation level read committed;
查询全局隔离级别
show global variables like "transaction_isolation";
查询当前会话隔离级别
show session variables like "transaction_isolation";
以下是修改测试:
set global transaction isolation level read committed;