面试好题:@Transactional声明式事务注解什么时候会失效?

这篇具有很好参考价值的文章主要介绍了面试好题:@Transactional声明式事务注解什么时候会失效?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面试题:@Transactional声明式事务注解什么时候会失效

前言

今天来分享一道比较有意思的面试题,“@Transactional声明式事务注解什么时候会失效?”。

对于这个问题,我们一起看看考察点和比较好的回答吧!

考察点

    这个问题就是面试官想考察我们对@Transactional注解有没有深刻的认识,以及日常开发中是否善于积累,认真思考。

回答

下面我从7个点来回答:

1.声明式事务主要是得益于SpringAOP,使用一个事务拦截器,在方法的调用前后/周围进行事务性的增强,来驱动事务的完成。其本质是通过生成一个代理子类,通过重写父类方法方式实现事务的代理增强!

2.事务失效场景1:注解在非public修饰的方法上,这是Spring强制要求的。

3.事务失效场景2:注解在final关键字修饰的方法上。原因是final关键字修饰的方法由于不能被子类重写,所以不能通过代理增强。

4.事务失效场景3:通过this调用方法,this关键字在jvm中指的是当前对象,而不是Spring代理后的代理对象,所以不具备事务增强的能力。

5.事务失效场景4:异常被try捕获,Spring事务默认只会回滚抛出RuntimeException类型异常,如果异常被try,事务不会被回滚。

@Transcational
public void method(){
    try{
        //业务代码    
    }catch(Exception e){
        e.printStackTrace();    
    }
}

6.事务失效场景5:抛出非RuntimeException类型异常且没有指定rollbackFor。Spring注解事务在没有手动指定rollbackFor参数的情况下,默认只会回滚抛出RuntimeException异常,可以通过手动指定rollbackFor参数改变这个策略。

7.事务失效场景6:新开线程处理。Spring事务管理器底层是通过ThreadLocal的原理来管理事务(ThreadLocall可以实现多线程下对共享资源访问的安全性保证)。但是无法控制跨线程之前的事务一致性。

@Transcational
public void methodB(){
    new Thread(new Runnable(){
            @Override
            public void run(){
                //insert into xxxx
                //update xxx
                //throw new RuntimeException            
            }
    });
}

以上就是我对于这个问题的理解。

总结

这个问题主要是考察求职者对Spring中事务基础能力的掌握。在实际应用中,声明式事务和编程式事务是非常重要和常见的功能,对于这部分内容如果理解不够深刻,很容易造成事务不生效的问题。希望读完这篇文章你有所收获。欢迎转发,关注微信公众号:程序员的故事,了解更多精彩面试题。

面试好题:@Transactional声明式事务注解什么时候会失效?

精选推荐

1.面试题:过滤器和拦截器的区别?

2.如何知道线程池中的线程任务执行完成?

3.面试题:为什么 SQL 语句不要过多的 join?

4.有没有排查过线上OOM问题,怎么处理的?

5.cpu飚高反应慢怎么排查?

6.@Resource和@Autowired的区别?

7.面试题:请说一下对象的创建过程?文章来源地址https://www.toymoban.com/news/detail-707949.html

到了这里,关于面试好题:@Transactional声明式事务注解什么时候会失效?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring声明式事务@Transactional的一些问题的测试及求证

    前提:有两个方法,a方法对a表做修改操作,b方法对b表做修改操作 a方法调用b方法,然后a方法报错,伪代码如下 a方法调用b方法,然后b方法报错,伪代码如下 直接上结果: √:数据库插入成功 ×:数据库插入失败 在 Spring Boot 中,默认情况下,对于单个数据库操作(即单个

    2024年02月14日
    浏览(36)
  • 使用注解新开事务 @Transactional

    使用注解新开事务

    2024年02月07日
    浏览(36)
  • Spring——事务注解@Transactional【建议收藏】

    在某些业务场景下,如果一个请求中,需要同时写入多张表的数据或者执行多条sql,为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到事务;Spring框架下,我们经常会使用@Transactional注解来管理事务; 本篇介绍Spring的事务注

    2024年02月03日
    浏览(48)
  • @Transactional注解作用,不生效的场景,事务回滚

    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。 在启动类上添加@EnableTransac

    2024年02月10日
    浏览(50)
  • 【spring(四)】Spring事务管理和@Transactional注解

    🌈键盘敲烂,年薪30万🌈 目录 Spring中的事务管理 问题抛出: 解决方案: @Transactional注解: rollbackFor属性: propagation属性: 应用: 📕总结 知识回顾: ❓什么是事务 事务是对数据操作的集合,它是数据操作的最小执行单位,也就是说,要么一个事务中操作全部执行完毕,

    2024年01月17日
    浏览(49)
  • Spring @Transactional注解事务传播机制propagation参数说明

    在SpringBoot项目中,我们通常使用 @Transactional 去进行事务控制,而 @Transactional 注解中,有个比较关键的属性就是 propagation 。在一个 多事务 的环境中,一个事务方法调用另一个事务方法时,就会涉及到事务的传播行为,该属性用来控制一段代码经过多个 @Transactional 注解生效(

    2024年02月11日
    浏览(43)
  • 28.基于注解的声明式事务

    将之间的使用的数据库表 t_user 更改为 t_user1 ,使用的依赖和对应的 jdbc.properties 不变即可 准备数据库 BookSql.sql 创建组件 BookController.java BookDao.java BookDaoImpl.java BookService.java BookServiceImpl.java 所有组件文件: Spring配置文件 spring-tx-annotation.xml 用户购买图书,先查询图书的价格,

    2024年02月15日
    浏览(33)
  • 14、Spring之基于注解的声明式事务

    事务功能的相关操作全部通过自己编写代码来实现: 编程式事务的缺陷: 细节没有被屏蔽:所有细节都需要程序员自己来完成,比较繁琐。 代码复用性不高:每次实现功能都需要自己编写代码,代码没有得到复用。 因为事务控制的代码有规律可循,代码的结构基本是确定的

    2024年02月10日
    浏览(41)
  • Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

    目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列专

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包