spring隔离级别与数据库隔离级别

一、数据库是事务的四大特性(ACID)

1. 原子性

   不可分割的工作单位,要么全部成功要么,全部失败

2. 一致性

 一个事务执行前后,表中数据必须保持一致。
 比如: 从A账户转账到B账户,不可能因为A账户扣钱了,而B账户没有加钱

3. 隔离性

   事务的隔离性是指在并发环境中,并发的事务时互相隔离的,一个事务的执行不能被其他事务干扰。

4. 持久性

 事务一旦提交后,数据库中的数据必须被永久的保存下来。

二、数据库的隔离级别

1、数据库并发问题

1. 脏读 :

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个未提交的数据。
如:有两个事务A和B
事务A通过where id =1,查询到age = 18,然后事务B同时去update这个id = 1 的数据 把age = 20,但是未提交
此时事务A再次查询 id= 1时结果为age = 20,两次查询结果不一致。
那么,这种在一个事务里面,由于其他的时候修改了数据并且没有提交,而导致了前后两次读取数据不一致的情况,这种事务并发的问题,我们把它定义成脏读。

2. 不可重复读 :

是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。
如:有两个事务A和B
事务A通过where id =1,查询到age = 18,然后事务B同时去update这个id = 1 的数据 把age = 20,已提交
此时事务A再次查询 id= 1时结果为age = 20,两次查询结果不一致。
这种第一个事务读取到了其他事务已提交的数据导致前后两次读取数据不一致的情况,就像这里,age 到底是等于 16 还是 18,那么这种事务并发带来的问题,我们把它叫做不可重复读。(发生在update操作)

3. 幻读 :

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样
如:有两个事务A和B
事务A通过where age=18,查询到一条数据,然后事务B又新增了一条age = 18的数据
此时事务A再次查询 age=18时,结果有两条数据,两次查询结果条数不一致。
那么,一个事务前后两次读取数据数据不一致,是由于其他事务插入数据造成的,这种情况我们把它叫做幻读(发生在insert、delete操作)

2、数据库事务隔离级别由低往高分类

1. 读未提交:

这是最不安全的一种级别,查询语句在无锁的情况下运行,并能读取到别的未提交的数据,造成脏读,如果未提交的数据全部回滚了,而之前读取了这个事务的数据即是脏数据。

2. 读已提交(Oracle默认隔离级别):

一个事务只能读取数据库已经提交过的数据,解决了脏读,但是不能重复读,即一个事务内的两次查询返回的数据是不一样的。如:第一次查询金额是100,第二次去查询可能就是50了,这就是不可重复读

3. 可重复读(Mysql默认隔离级别):

一个事务内的两次无锁查询返回的数据都是一样的,但是别的事务的新增数据也能读取到。
比如:另一个事务插入了一条数据并提交,这个事务第二次去读取的时候发现多了一条之前查询数据列表里面不存在的数据,这时候就出现了幻读。这个级别避免了不可重复读但是不能避免幻读

4. 可串行化读:

这是效率最低最耗费资源的一个事务级别,和可重复读类似,但在自动提交模式关闭的情况下可串行化读回给每个查询加上共享锁和排它锁,意味着所有的读操作之间不阻塞,但读操作会阻塞别的事务的写操作,写操作也会阻塞读操作

在这里插入图片描述

三、Spring事务中5种事务的隔离级别

1、default(默认)

PlatfromTransactionManager 默认的隔离级别
使用数据库默认的事务隔离级别,
除了default 其它几个Spring事务隔离级别与JDBC事务隔离级别相对应

2、read_uncommited(读未提交)

一个事务可以读取另外一个事务未提交的数据
这可能出现脏读 而且不可重复度,出现幻像读等.

3、read_commited(读已提交)

一个事务可以读取另一个事务已经提交的数据
不可以读取未提交的数据
可以避免脏读 但是无法避免不可重复读和幻像读

4、repeatTable_read(可重复读)

一个事务可以读取另外一个事务已经提交的数据
可以避免脏读的前提下 也可以避免不可重复读
但是还是无法避免幻像读

5、serializable(串行化)

这是一个花费较高但是比较可靠的事务隔离级别
可以避免脏读 幻像读和不可重复读
(事务被处理为顺序执行)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值