spring事务属性的五大器官!!!(二)

202 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

指向上一篇spring事务属性的五大器官!!!(一) - 掘金 (juejin.cn)

本次话题将通过三篇博客对自己学习spring的事务属性的五大方面(学习资料☞《spring实战》)的笔记进行整理发布,如果问题,请多担待,如对您学习有所帮助,请点个赞👍吧,♥

摘要:

声明式事务的第二个维度就是隔离级别,隔离级别定义了一个事务可能受其他事务影响的程度,另一种考虑隔离级别的方式就是将其想象成事务对于事务数据的保密程度

事务可能造成的问题

在显示场景中,多个事务并发运行,就是常规操作,经常就会不同的事务操作相同的数据完成各自的任务,这种并发,是肯定会有的,但凡存在并发,就会导致以下问题:

①脏读:

脏读发生在一个事务读取了另一个事务已经改写但是还没有提交的改动,就比如,

有这样一条数据:name:jack,age:20,这个时候事务A要把age改成21,但是还没有提交,事务b开始了,事务b直接读到了这个人的年龄是21,但是A思考了下,这个人还没到21,埃,不改了,给他的年龄恢复了20,这个时候事务b提交的数据就是错的了。

②幻读:

幻读发生在一个事务读取了数据,读取完之后,另一个事务对这数据进行了更新,然后第一个事务再次读取这个数据,此时就造成第一次和第二次读取的事务不相等,这就是幻读,同样举个栗子:

假如存在数据表中存在一条数据,事务a第一次查到的数量时是1,但是事务b给这个表插入了一条数据,那么事务a再次查的时候,就发现数据总是成了2了,就好像产生了幻觉。

③不可重复度

不可重复度发生在一个事务执行相同的数据两次或者两次以上的时候,每次得到的数据都不同,这就是因为这期间另一个事务对这个进行了更新:

就比如同样是这条数据:name:jack,age:20,事务A第一次读取这个数据读到name是jack,age是20,然后这个时候,事务B开始了,他将age改成了25,然后事务A又再读了一次,发现年龄咋变成25了,这就是所谓的不可重复读啦。

spring的隔离级别

①ISOLATION_DEFAULT:

使用后端数据库的默认隔离级别

②ISOLATION_READ_UNCOMMITTED:

允许读取尚未提交的数据变更,有可能造成脏读、幻读、不可重复读

③ISOLATION_READ_COMMITTED:

允许读取并发事务已经提交的数据,可以防止脏读,可能造成幻读、不可重复度

④ISOLATION_REPEATABLE_RED:

对同一字段的多次读取结果是一致的,除非数据是被本事务自己所修改的,可以阻止脏读和不可重复读,可能会产生幻读

⑤ISOLATION_SERIALIZABLE:

完全服从ACID的隔离级别,确保防止脏读、幻读、不可重复读,这个是最慢的事务隔离,因为一般是对事务相关的数据库表加了锁