隔离级别

  1. read uncommitted:读未提交
    1. 产生的问题脏读不可重复读幻读
  2. read committed:读已提交 (Oracle)
    1. 产生的问题不可重复读 , 幻读
  3. repeatable read:可重复读 (MySQL默认)
    1. 产生的问题幻读
  4. serializable:串行化
    1. 可以解决所有的问题

==注意:隔离级别从小到大安全性越来越高,但是效率越来越低==;
幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据 , 导致每次读取的数据不一致
所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数)

隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

1.第一种隔离级别:Read uncommitted(读未提交)

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

解决了更新丢失,但还是可能会出现脏读

2.第二种隔离级别:Read committed(读已提交)

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了更新丢失和脏读问题

3.第三种隔离级别:Repeatable read(可重复读)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

4.第四种隔离级别:Serializable(可串行化)

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
提供严格的事务隔离,它要求事务序列化执行,
事务只能一个接着一个地执行,但不能并发执行
如果仅仅通过“行级锁”是无法实现序列化的,
必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。
序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读
解决了更新丢失、脏读、不可重复读、幻读(虚读)