数据库隔离级别种类
安全级别依次升高,读写性能依次降低。
- Read uncommitted (读未提交)
- Read committed (读已提交)
- Repeatable read (可重复读)
- Serializable (可串行化)
重要概念
- 脏读
- 不可重复读
- 幻读
脏读
读到别的事务没有提交的数据。
A事务,会读取到B事务还未提交的数据。因为B事务可能会因为各种原因数据回滚,所以如果A事务读取了B未提交的数据,然后基于此进行一些业务操作,但是B事务发生错误回滚了,那A事务的业务操作就错了。
不可重复读
不可重复度是指读的时候 别的事务修改了数据(update)。
在同一个事务生命周期内,也就是这个事务还未提交之前。如果另外一个事务,对数据进行了编辑(update)或者删除(delete)操作。那么A事务就会读取到。简单理解,就是在一个事务生命周期内,多次查询数据,每次都可能查出来的不一样。
幻读
幻读是指读的时候,别的事务插入或者删除了数据(insert or delete)。
幻读的结果其实和不可重复读是一样的表现,差异就在于,不可重复读,主要是针对其他事务进行了编辑(update)和删除(delete)操作。而幻读主要是针对插入(insert)操作。也就是在一个事务生命周期内,会查询到另外一个事务新插入的数据。
Read uncommitted (读未提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
实际上,读未提交无法避免 脏读、不可重复读、幻读,导致数据一致性很难保证。因此,实际生产环境中,用的不太多。但是如果对性能要求比较高,数据安全性要求不太高的场景可以使用。
Read committed (读已提交)
Oracle等多数数据库默认都是该级别。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
上图根据 a=1 一顿操作之后,第二次获取a发现,已经被置成2了,那么就是说,事务不是独立,数据的一致性还是有比较大的隐患。
读已提交,可能会在同一个事务中,出现读同一个数据前后不一致的情况。
读已提交没办法避免 不可重复读、幻读。
Repeatable read (可重复读)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
mysql-InnoDB默认级别,重要的内容加粗加斜!
可以避免脏读和不可重复读,但是无法避免幻读。
Serializable (可串行化)
Serializable完全串行化的读,每次读都需要获得表级共享锁,读写相互会相互互斥,这样可以更好的解决数据一致性的问题,但是同样会大大的降低数据库的实际吞吐性能。所以该隔离级别因为损耗太大,一般很少在开发中使用。
最后安利一个图
会有不定期更新,转载请说明来源,以便纠错或者拓展。