最低的隔离级别,允许读取尚未提交的数据变更,可能造成脏读、不可重复读、幻读。
允许读取并发事务已经提交的数据,可以避免脏读,但是可能造成不可重复、幻读。
对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读。(MySQL InnoDB存储引擎默认的事务隔离级别是可重复读)
最高的隔离级别,完全服从ACID的隔离级别,读写操作都会加锁,多个事务要访问同一条记录时,要进行排队,优先级低的事务必须等优先级高的事务完成以后才能进行。所有的事务依次执行,可以避免脏读、不可重复读、幻读。
脏读就是读取到未提交的数据, 比如如下代码
#先设置事务隔离级别为读取未提交,然后开启事务
start transaction;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#B事务查询账户表就会出现脏读(查询到其他事务未提交的数据)
#A事务执行回滚,数据就会还原了.
#先设置事务隔离级别为读取已提交,然后开启事务
start transaction;
#B事务查询id = 1 数据的金额
select * from account where id = 1;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#A事务提交
#B事务还未进行提交事务又进行查询id = 1发现数据变化
select * from account where id = 1;
#在一次事务中多次查询数据不一致则是不可重复读问题
一般出现在删除和新增情况
#先设置事务隔离级别为可重复读,然后开启事务
start transaction;
#比如说用户表有两条数据,有一个是否完整的字段, 根据name和address判断, 如果都有则赋值完整
#A事务查询有数据符合赋值完整的数据,还未进行事务提交
#B事务有插入一条符合赋值完整的数据,在A事务提交之前提交了.
#A事务提交之后发现又有一条可以赋值的数据,此现象就称为幻读
从上到下,隔离级别依次变高,但是性能也依次变差。隔离级别对应出现的问题
隔离级别 | 是否出现脏读 | 是否出现不可重复读 | 是否出现幻读 |
---|---|---|---|
读取未提交 | 是 | 是 | 是 |
读取已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
可串行化 | 否 | 否 | 否 |
SELECT @@TX_ISOLATION;
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;