文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java spring嵌套事务和事务传播类型怎么理解

2023-06-02 14:13

关注

本篇内容主要讲解“java spring嵌套事务和事务传播类型怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java spring嵌套事务和事务传播类型怎么理解”吧!

  一个有事务的方法,去调用另一个有事务的方法,会怎么样?

  一个没有事务的方法,去调用一个有事务的方法,会怎么样?

  多事务嵌套问题解答

  1、在同一个类中,一个无事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,注解事务是不会生效的

  2、在同一个类中,一个有事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,只有外层事务有效,被调的注解事务是不会生效的

  3、在不同类中,一个无事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,有注解事务是生效的

  4、在不同类中,一个有事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,两个方法都有事务

  代码示例:

  @Service

  public class PersonServiceImpl implements PersonService {

  @Autowired

  PersonDao personDao;

  @Override

  @Transactional

  public boolean addPerson(Person person) {

  boolean result = personDao.insertPerson(person)>0 ? true : false;

  return result;

  }

  @Override

  @Transactional

  public boolean updatePersonByPhoneNo(Person person) {

  boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false;

  addPerson(person); //测试同一个类中@Transactional是否起作用

  return result;

  }

  }

  上述的情况,说白了,就是在一个Service内部,事务方法之间的嵌套调用,不管被调用普通方法和事务方法,都不会开启新的事务!郑州哪家人流医院好 http://www.gz020zj.com/

  spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。

  总结:spring采用动态代理机制来实现事务控制,动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!

  重点:自己也可以实现一个事务,原理就是AOP中的动态代理

  解决的嵌套事务方法就简单了(两种):

  把这两个方法分开到不同的类中,把注解加到类名上面;

  Spring事务7种传播属性:

  REQUIRED(require)默认级别:不存在事务则创建一个事务

  REQUIRES_NEW(requires_new):新建一个自己的事务,不论当前是否存在事务,已存在的事务挂起

  NESTED(nested):存在事务则运行在嵌套事务中,不管是调用者还是被调用者不存在则创建一个事务

  SUPPORTS(supports):存在事务则加入,不存在也可以

  NOT_SUPPORT(not_support):以非事务方式运行,如果当前存在事务,则把当前事务挂起

  MANDATORY(mandatory):如果当前存在事务,则运行在当前事务中,如果当前无事务,则抛出异常,也即父级方法必须有事务

  NEVER(never):当前方法不能运行在事务中,存在事务则抛出异常

  代码中实现:

  @Override

  @Transactional(propagation = Propagation.REQUIRED)

  public void addEmpByRequired(String name) {

  Employee employee = new Employee();

  employee.setDeptId(1);

  employee.setName(name);

  employee.setAddress("邯郸");

  employeeMapper.insertSelective(employee);

  departmentService.addDept("jishubu");

  int i = 1/0;

  }

到此,相信大家对“java spring嵌套事务和事务传播类型怎么理解”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯