美文网首页
Spring事务学习

Spring事务学习

作者: Spring_java | 来源:发表于2019-11-13 11:33 被阅读0次

最近要去面试,有几个事务知识点需要复习下:

1:在同一个Service中。A方法存在事务,创建异常,事务回滚

事务1.jpg

事务A方法开启了事务,结果数据库中没有新增数据,因为异常而回滚了。

2:在同一个Service中,A没有事务,B有事务,A调用B方法。出现异常,但是事务不生效

事务 2.jpg

如图所示,不看注释的代码。A不存在事务,B存在事务,B中存在错误,A去调用B的方法。

原始数据为:


数据 4.jpg

结果是:A插入数据成功,B删除成功,虽然发生异常,但是不会回滚。

具体原因是:


原始调用链路 9.jpg

调用delete的方法时,是采用了this来调用
当在一个类调用的时候,没有生成代理对象,是使用this来调用,结果就是不会去进行拦截来开启事务管理。
数据库最终效果:


数据6.jpg

55为新插入的数据,而50就被删除了数据。

2:在同一个Service中,A没有事务,B有事务,A调用B方法。出现异常,事务生效

调用链路 8.jpg

在这里,调用delete的方法是代理类来调用了。
下面是解决方案:

  • 1.把方法B抽离到另外一个XXService中去,并且在这个Service中注入XXService,使用XXService调用方法B;
    显然,这种方式一点也不优雅,且要产生很多冗余文件,看起来很烦,实际开发中也几乎没人这么做吧?.反正我不建议
    采用此方案;

  • 2.通过在方法内部获得当前类代理对象的方式,通过代理对象调用方法B

    上面说了:动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!

    所以我们就使用代理对象来调用,就会触发事务;

获取代理对象的方法:

1.使用 ApplicationContext 上下文对象获取该对象;
2.使用 AopContext.currentProxy() 获取代理对象,但是需要配置exposeProxy=true

启动类加上注解: @EnableAspectJAutoProxy(exposeProxy = true)
PlusService plusService = (PlusService) AopContext.currentProxy();
使用接口的方式,而不是使用实现类,否则会报错

结果: 新插入数据成功,但是异常导致删除数据出现回滚,没有删除


数据 7.jpg

相关文章

  • spring04

    Spring JdbcTemplate学习 Spring 声明式事务 xml配置实现 Spring 声明式事务 注...

  • Spring0001

    1.【Spring学习34】Spring事务(4):事务属性之7种传播行为 https://blog.csdn.n...

  • spring事务学习

    PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibern...

  • Spring 事务 学习

    笔记简述本学习笔记主要是介绍了事务相关的基础知识,学习编程式事务和声明式事务等不同的事务使用方法。不过现在实际开发...

  • Spring事务学习

    最近要去面试,有几个事务知识点需要复习下: 1:在同一个Service中。A方法存在事务,创建异常,事务回滚 事务...

  • 关于事务的思考

    Spring对于事务的支持 Spring事务接口 Spring事务管理器 Spring并不直接管理事务,而是提供多...

  • Spring事务

    Spring 事务 分类 Spring可以支持编程式事务和声明式事务。 编程式事务 实现 Spring使用事务管理...

  • Spring 事务管理简介

    学习完整课程请移步 互联网 Java 全栈工程师 本节视频 【视频】Spring 的事务管理-Spring 事务管...

  • Spring中实现事务方式

    Spring 中实现事务的方式 Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,...

  • Spring事务的传播特性引发的一场血案

    Spring事务的传播特性是对于Spring事务管理的一项特殊配置;Spring事务基于Spring AOP特性,...

网友评论

      本文标题:Spring事务学习

      本文链接:https://www.haomeiwen.com/subject/vflhictx.html