一、概述

数据库事务的隔离级别分为四种:(后面为解决的问题,结合下文案例深入理解)

1.读未提交(Read Uncommited)事务1修改的数据被事务2给回滚了

2.读已提交(Read Commited)事务1读到其他事务修改但是没有提交的信息

3.可重复读(Repeatable Read)在事务1进行多次的查询操作的时候,查询的结果不一致的

4.可串行化(Serializable)在同一事务中查询的时候发现多了很多条记录

二、隔离级别出现的原因

为了解决事务在并发执行的时候不会相互影响,所以就引入了事务的隔离级别(也就是在多个事务同时对一个数据进行读取、更新等操作的时候,如何保证数据的正确性和一致性)

三、四种事务隔离级别各自解决的问题

脏写

脏读

不可重复读

幻读

读未提交


×

×

×

读已提交



×

×

可重复读




×

可串行化





四、不同的隔离级别解决的问题

  • 脏写(事务1修改的数据被事务2给回滚了)

事务1

事务2

T1

begin

T2

begin

T3

update xxx set password= 200 where id = 1

T4

update xxx set password= 1000 where id = 1

T5

commit

T6

Rollback

事务1对数据的修改丢失了,这是一个非常严重的错误,即自己修改的数据被被人给回滚了,在任何隔离级别的情况下都是解决了脏写问题。

  • 脏读(事务1读到其他事务修改但是没有提交的信息、临时信息)

事务1

事务2

T1

begin

T2

begin

T3

update xxx set password= 99 where id = 1

T4

select password from xxx where id = 1

T5

commit

T6

RollBack

也就是事务1读到了其他事务修改但是没有提提交的记录信息。在读已提交的隔离级别下就解决了脏读问题。

  • 不可重复读(在同一事务进行多次的查询操作的时候,查询的结果是不一致的)

事务1

事务2

T1

begin

T2

begin

T3

select password from xxx where id = 1

T4

update xxx set password = 99 where id = 1

T5

select password from xxx where id = 1

T6

update xxx set password= 88 where id = 1

T7

select password from xxx where id = 1

T8

update xxx set password= 88 where id = 1

T9

commit

T10

commit

在同一事务中每次进行查询的时候数据都是在变化的,在可重复读的隔离级别下解决了不可重复的的问题。

  • 幻读(在同一事务中查询的时候发现多了很多条记录,称为幻影记录) 

事务1

事务2

T1

begin

T2

begin

T3

select * from xxx where id > 100

T4

insert into xxx(id,password) values (199,11)

T5

select * from xxx where id > 100

T6

insert into xxx(id,password) values (200,11)

T7

select * from xxx where id > 100

T8

insert into xxx(id,password) values (201,11)

T9

commit

T10

commit

发现在同一事务中每次查询的时候都会有新的数据的出现,这就是幻读问题,在可串行化(序列化)的隔离级别下解决了幻读的问题

 五、混淆点&知识点

  • 多次查询的的时候发现数据变少了,是幻读还是不可重复读

答:不可重复读。幻读一定是数据增多了(可以从字面意思上理解,幻读即出现幻影记录,那么就是两次读发现多了数据),如果是数据减少了,那么就是不可重复读

  •  脏写和脏读的回滚问题

两者都是由于事务1在进行操作的时候其他事务回滚导致的问题,脏写是其他事务回滚导致自己写入的数据无效了,脏读则表示的是其他事务回滚导致读到的是无效的数据,由于脏写是所有事务隔离级别都解决的,所以做了解即可(一般通过加锁就可以解决)

  • 四种隔离级别的问题严重性

问题严重性:脏写>脏读>不可重复读>幻读

  • 在MYSQL中的事务隔离级别

在MySQL中innodb存储引擎下的隔离级别是可重复读,但是得益于innodb的MVCC版本控制,MYSQL在可重复读的隔离级别下同时解决了幻读的问题

六、四种隔离级别的比较总结

  • 并发性

从字面意思上即可理解:

1.可串行化并发能力最低,所有的事务等待执行,解决所有问题,安全性高,但是效率低下

2.之后并发能力一次递增:串行化<可重复读<读已提交<读未提交

3.在实际的开发中根据业务的具体需求,权衡并发性和数据安全性选择对应的隔离级别