定义
SQL标准定义了4种隔离级别,用来限定事务的哪些改变是可见的,哪些是不不可见的,一般来低级别的隔离级别支持更高的并发,并拥有更低的系统开销。
四种隔离级别
未提交读(Read Uncommitted)
解释:所有的事务都可以看到其他无论是提交还是未提交事务的执行结果
带来问题:会出现脏读现象(读取到别人未提交的数据)。
解决问题:不能解决任何问题,其实对系统的开销、并发性也一般。
提交读(Read Committed)
解释:读到的数据是其他事务提交之后的数据
带来问题:这个级别会出现不可重复读现象(在同一个事务里,前后两次相同的select会读到不同的结果)
解决问题:==这是大多数数据库默认的隔离级别(mysql innodb事务的隔离级别默认是可重复读)==,该级别是可以解决脏读的现象。
可重复读(Repeatable Read)
解释:在同一个事务里,select结果是事务开始时间点的状态,同样的SELECT操作读到的结果会是一致的。
问题:会出现幻读数据(幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行),这时候就需要用串行读隔离级别了。
解决问题:可解决不可重复读的问题,因为这个级别是对行数据锁定,在这个事务里数据,其他的事务对该数据不能修改,但可以插入,从而出现了幻读的情况。
幻读可不可重复读的区别就是,幻读是对数据的新增或者删除,不可重复读是数据的修改。不可重复读、幻读都是使用悲观锁的机制来处理这两种问题,但是MySQL、ORACLE、PostgreSQL等成熟的数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免这两种问题。
串行读(Serializable)
解释:读操作会隐式获取共享锁,可以保证不同事务间的互斥。
附图一张:
隔离级别设置(mysql)
查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别
select @@global.tx_isolation,@@tx_isolation;
更改会话级的隔离级别
set session tx_isolation=‘read-uncommitted‘;
更改系统级的隔离级别
set session tx_isolation=‘read-uncommitted‘;