学习笔记——Spring(7)事务的传播行为和隔离级别

事务的传播行

如果一个方法(事务方法或非事务方法)里面调用了其他的方法(事务方法或非事务方法),那么Spring是怎样处理的呢?
这就涉及到Spring事务的传播行为,@Transactional注解中可以通过设置propagation属性来管理事务的传播行为。
propagation属性有以下几种设置,分别对应不同的事物传播行为:

Propagation.REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。事物默认传播行为。
Propagation.REQUIRES_NEW新建事务,如果当前存在事务,就把当前事务挂起,当新事物结束后,再去执行原事物。
Propagation.SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
Propagation.NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
Propagation.NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
Propagation.MANDATORY支持当前事务,如果当前没有事务,就抛出异常。

下面用A、B两个方法进行举例说明,其中A方法中调用B方法:

  • Propagation.REQUIRED:当B是事务方法时(B方法或B方法所在类上使用了@Transactional注解),假设A方法是也事务方法,则B方法加入到A方法事务中。此时无论AB哪个方法出现异常,AB方法中的数据库操作都会回滚;假设A方法不是事务方法,则会针对B方法新开启一个事物。
  • Propagation.REQUIRES_NEW:无论A是不是事务方法,都会开启一个新事务执行B,如果A是事务方法,则在执行到B方法时A方法事物先挂起,待B方法执行完毕在继续处理。
  • Propagation.SUPPORTS:B方法上加@Transactional(propagation = Propagation.SUPPORTS),如果A方法是事务方法,则B方法加入到A方法事务中;如果A不是事务方法,则B方法也以非事务方法执行。
  • Propagation.NOT_SUPPORTED:B方法始终以非事务方法执行,如果A方法是事务方法则将其事务先挂起。
  • Propagation.NEVER:要求A方法不能是事务方法,如果A方法是事务方法就会抛出异常。
  • Propagation.MANDATORY:要求A方法必须是事务方法,然后B方法加入到当前事务中,如果A方法不是事务方法就会抛出异常。

事务的隔离级别

事务隔离级别指的是一个事务对数据的修改与其他并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生脏读、幻读、不可重复读。

脏读:    Dirty reads--读脏数据。一个事务读到另一个事务未提交的更新数据。人家事务读到了你修改之后还没提交的值,这就是脏读了(对应的脏写就是两个事务没提交的状况下,都修改同一条数据,结果一个事务回滚了,把另外一个事务修改的值也撤销了,所谓脏写就是两个事务没提交状态下修改同一个值。无论是脏写还是脏读,都是因为一个事务去更新或者查询了另外一个还没提交的事务更新过的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了,或者你之前查询到的数据就没了,这就是脏写和脏读两种场景)。也就是说,就是指事务B读到了事务A还没有提交的数据。比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。比如银行存钱,两个事物A和B同时进行,分别先查询到余额为0,继而进行存款操作,事务B操作成功存入100元,事务A操作失败导致回滚,余额恢复为0,此时事物B线程再去查询发现存入的钱没有了,这就是脏读。

幻读:phantom reads--幻象读数据。是指当事务不是独立执行时发生的一种现象。这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。再比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。

不可重复读: non-repeatable reads--数据不可重复读。在一个事务里面的操作中发现了未被操作的数据。比如说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。

Spring可设置的事务隔离级别
隔离级别描述
DEFAULT使用数据库本身使用的隔离级别
ORACLE(读已提交)、MySQL(可重复读)
READ_UNCOMITTED读未提交(脏读)最低的隔离级别,一切皆有可能。
READ_COMMITED读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。
REPEATABLE_READ可重复读,解决不可重复读的隔离级别,但还是有幻读风险。
SERLALIZABLE串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

Spring设置隔离级别方式:

xml文件: 

 <tx:advice id="advice" transaction-manager="transactionManager">
 	<tx:attributes>
 		<tx:method name="fun*" propagation="REQUIRED" isolation="DEFAULT"/>
 	</tx:attributes>
 </tx:advice>

注解方式:

@Transactional(isolation=Isolation.DEFAULT)
public void fun(){
	dao.add();
	dao.udpate();
}

 

Spring建议的是使用DEFAULT,就是数据库本身的隔离级别,配置好数据库本身的隔离级别,无论在哪个框架中读写数据都不用操心了。而且万一Spring没有把这几种隔离级别实现的很完善,出了问题就麻烦了。

 

 

参考1:https://blog.csdn.net/u010740707/article/details/84820200

参考2:https://blog.csdn.net/qq_38526573/article/details/87898730

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值