Spring如何在一个事务中开启另一个事务

 更新时间:2020年01月02日 12:02:39   投稿:yaominghui  
这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

spring使用@Transactional开启事务,而且该注解使用propagation属性来指定事务的传播级别

@Transactional(propagation =Propagation.REQUIRES_NEW) // 开启一个新事务

使用REQUIRES_NEW就会开启一个新的事务吗? 答案并不是.

请看下面的这个示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import qinfeng.zheng.learnpagequery.domain.UserDO;
import qinfeng.zheng.learnpagequery.mapper.UserMapper;

@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;


  @Transactional(rollbackFor = Exception.class)
  public void doSomething(UserDO userDo) {
    insert(userDo);
    doOther();
  }

  @Transactional(propagation =Propagation.REQUIRES_NEW) // 开启一个新事务
  public void insert(UserDO userDo) {
    userMapper.insert(userDo);
  }

  public void doOther() {
    System.out.println("做一些其它的事,比如调用其它的系统");
  }
}

在调用doSomething方法时,开启了一个事务,该方法中包括insert和doOther, 但是insert方法上也开启了一个事务. 按道理应该有两个事务控制,可事实上并不是, insert方法的事务无效. 这就跟spring事务原理有关系, spring框架是通过TransactionInterceptor类来控制事务开启,提交,回滚等, 它会创建一个目标类的代理类. 而在本示例中,doSomething方法调用insert方法时,并不是通过代理类去调用,而是通过this调用本身的方法insert方法.所以insert方法的事务并不会开启.

解决方法

1. 将insert方法抽取到另一个XxxService方法中, 然后再将这个XxxService注入到UserService类中,通过xxxService.insert()调用, 这样insert方法的事务就会生效了.

2. 第2种方式通过AopContext创建一个代理

 在项目启动类上开启 exposeProxy = true

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@Transactional(rollbackFor = Exception.class)
public void doSomething(UserDO userDo) {
  UserService userService = (UserService) AopContext.currentProxy();
  userService.insert(userDo); // 这样insert方法事务生效
  doOther();
}

备注: 在springboot1.x中使用@EnableTransactionManagement开启事务, 但是在springboot2.x中,默认就开启了事务,所以勿须在启动类上添加此注解了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot Logging Level设置为off时的Bug

    Spring Boot Logging Level设置为off时的Bug

    这篇文章主要介绍了Spring Boot Logging Level设置为off时的Bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java @Value(

    java @Value(

    这篇文章主要介绍了java @Value("${}")获取不到配置文件中值的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • JMS简介与ActiveMQ实战代码分享

    JMS简介与ActiveMQ实战代码分享

    这篇文章主要介绍了JMS简介与ActiveMQ实战代码分享,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringBoot CountDownLatch多任务并行处理的实现方法

    SpringBoot CountDownLatch多任务并行处理的实现方法

    本篇文章主要介绍了SpringBoot CountDownLatch多任务并行处理的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Spring Boot 配置大全(小结)

    Spring Boot 配置大全(小结)

    本篇文章主要介绍了Spring Boot 配置大全(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Spring Boot中使用MongoDB的连接池配置的方法

    Spring Boot中使用MongoDB的连接池配置的方法

    本文介绍了Spring Boot中使用MongoDB的连接池配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java多线程编程技术详解和实例代码

    java多线程编程技术详解和实例代码

    这篇文章主要介绍了 java多线程编程技术详解和实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java实现JDBC向数据库批量插入

    Java实现JDBC向数据库批量插入

    在Java项目中可能会出现大量向数据库中插入的情况,本文主要介绍了Java实现JDBC向数据库批量插入,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 关于SpringCloudStream配置问题

    关于SpringCloudStream配置问题

    这篇文章主要介绍了关于SpringCloudStream配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Intellij idea热部署插件JRebel的使用

    Intellij idea热部署插件JRebel的使用

    这篇文章主要介绍了Intellij idea热部署插件JRebel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论