文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解在SpringBoot中@Transactional事物操作和事物无效问题排查

2024-04-02 19:55

关注

1.spring事务管理简述

两种事务管理方式:

  1. 编码式事务管理:将事务控制代码编写在业务代码之中。
  2. 声明式事务管理:基于AOP(面向切面编程),事务管理与业务逻辑解耦。声明式事务管理的两种实现:
    1. 在配置文件(xml)中配置。
    2. 基于@Transactional注解。

2.SpringBoot中使用@Transactional注解

2.1.开启事务注解

在项目主类上,加上注解@EnableTransactionManagement,例如:


@EnableTransactionManagement
public class MySpringBootService extends WebMvcConfigurerAdapter {
    public static void main(String[] args) {
        SpringApplication.run(CoreService.class, args);
    }
}

2.2.在目标类、方法上添加注解@Transactional

1. 如果将@Transactional添加到类上,则表示此类的所有方法都开启事务管理。如:


   @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
   @Service
   public class MyServiceImpl implements MyService {
     //class body
   }

2. 如果将@Transactional添加到方法上,则表示此方法开启事务管理。如:


       @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
       @Override
       public ActivityPo getActivityById(Long id){
         //method body
       }

3. 如果一个方法上存在@Transactional,且其所属类上同样存在@Transactional,则以方法级别的事务配置为准。

2.3.细化事务配置

关于@Transactional的可配置参数有很多,主要有propagation、rollbackFor等,可以适用于不同场景,这里不细说。

3.@Transactional事务实现机制

3.1.整体事务控制流程

  1. 当@Transactional注解的方法被类外部的代码调用时,Spring在运行时为方法所在类生成一个AOP代理对象。
  2. 代理对象根据@Transactional的属性,决定是否由事务拦截器TransactionInterceptor对此方法进行事务拦截。
  3. 在进行事务拦截时,会先开启事务,然后执行业务代码,根据执行是否出现异常,通过抽象事务管理器AbstractPlatformTransactionManager来进行rollback或者commit。

3.2.Spring AOP的两种代理

  1. Spring AOP有两种CglibAopProxy和JdkDynamicAopProxy,其中:
  2. CglibAopProxy在其内部类DynamicAdvisedInterceptor的intercept()方法中,判断是否进行事务拦截。
  3. JdkDynamicAopProxy在其invoke()方法中,判断是否进行事务拦截。

3.3.事务操作的底层实现

  1. 抽象事务管理器AbstractPlatformTransactionManager的rollback和commit都需要具体的实现类进行实现。
  2. 抽象事务管理器AbstractPlatformTransactionManager的父级接口是PlatformTransactionManager。
  3. 存在很多事务管理器实现类,例如DataSourceTransactionManager等。
  4. 不同的事务管理器管理不同的数据资源 DataSource,比如DataSourceTransactionManager管理者JDBC数据源。
  5. 应确保被调用方法中使用的数据源都加载了事务管理器。

4.@Transactional使用注释实现及问题排查

4.1.数据库引擎是否支持事务?

4.3.注解所在的类是否被加载成Bean?

4.2.注解所在方法是否为public修饰的?


	
	protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) {
		// Don't allow no-public methods as required.
		if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
			return null;
		}
    
    //...
  }

4.5.是否发生了自调用问题?


@Service
public class PersonServiceImpl implements PersonService{
  @Resource
  private PersonDao personDao;
  
  public void insertPerson(Person person){
    //自调用
    personService.insert(person);
    
    //其他代码
    personDao.insertLog...
	}
  
  @Transactional(rollbackFor = Exception.class)
  public void insert(Person person){
    personDao.insert(person);
	}
}

4.6.所用数据源是否加载了事务管理器?


@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager(@Qualifier("sqlDataSource") DataSource sqlDataSource) {
  return new DataSourceTransactionManager(sqlDataSource);
}

4.4.触发回滚的异常是否配置正确?


@Transactional(rollbackFor = Exception.class)

4.5.@Transactional的扩展配置propagation是否正确?

4.7.事务管理的可选配置是否正确?

在SpringBoot中,关于事务的配置有两个可选配置(一般无需配置):

  1. Springboot启动类的@EnableTransactionManagement。
  2. Springboot配置文件的rollback-on-commit-failure属性:

# yaml配置
spring:
  transaction:
    rollback-on-commit-failure: true
    
# properties配置
spring.transaction.rollback-on-commit-failure=true

请确保上述配置都是正确的(或者未配置)。

到此这篇关于详解在SpringBoot中@Transactional事物操作和事物无效问题排查的文章就介绍到这了,更多相关SpringBoot使用@Transactional内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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