Spring 编程常见错误 50 例
傅健
Cisco 高级软件工程师、Netty 源码贡献者
17065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
结束语 (1讲)
期末测试 (1讲)
Spring 编程常见错误 50 例
15
15
1.0x
00:00/00:00
登录|注册

19 | Spring 事务常见错误(上)

你好,我是傅健。
通过上节课的学习,我们了解了 Spring Data 操作数据库的一些常见问题。这节课我们聊一聊数据库操作中的一个非常重要的话题——事务管理。
Spring 事务管理包含两种配置方式,第一种是使用 XML 进行模糊匹配,绑定事务管理;第二种是使用注解,这种方式可以对每个需要进行事务处理的方法进行单独配置,你只需要添加上 @Transactional,然后在注解内添加属性配置即可。在我们的错误案例示范中,我们统一使用更为方便的注解式方式。
另外,补充一点,Spring 在初始化时,会通过扫描拦截对事务的方法进行增强。如果目标方法存在事务,Spring 就会创建一个 Bean 对应的代理(Proxy)对象,并进行相关的事务处理操作。
在正式开始讲解事务之前,我们需要搭建一个简单的 Spring 数据库的环境。这里我选择了当下最为流行的 MySQL + Mybatis 作为数据库操作的基本环境。为了正常使用,我们还需要引入一些配置文件和类,简单列举一下。
数据库配置文件 jdbc.properties,配置了数据连接信息。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=pass
JDBC 的配置类,从上述 jdbc.properties 加载相关配置项,并创建 JdbcTemplate、DataSource、TransactionManager 相关的 Bean 等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring事务管理中常见的错误案例和解决方法进行了详细介绍。文章首先通过具体案例展示了在使用@Transactional注解时可能出现的问题,指出了Spring在处理事务过程中对异常的回滚规则。随后,针对两个具体案例进行了分析和解决方法的讲解,包括修改异常类型和调整方法修饰符等。通过对Spring源码的解析,深入浅出地介绍了Spring事务管理中的常见错误,并提出了解决方法。总结强调了Spring声明式事务机制的特点,以及对private方法、异常回滚规则的处理方式,为读者提供了清晰的技术指导和思考题,帮助读者更好地理解和应用Spring事务管理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring 编程常见错误 50 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 辰砂
    @Transactional(rollbackFor = Exception.class, noRollbackFor = RuntimeException.class)
    2021-06-04
    28
  • 陈汤姆
    学到了,一直以为注解只能对public生效是因为动态代理的原因!
    2021-06-15
    4
    2
  • LkS
    可以使用noRollbackFor @Transactional(rollbackFor = Exception.class,noRollbackFor = RuntimeException.class)
    2021-06-04
    2
  • study的程序员
    事务层面默认 publicMethodsOnly=true,所以private或者protected都不生效 强行设置 publicMethodsOnly=false: @Bean @Primary @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionAttributeSource mytransactionAttributeSource() { return new AnnotationTransactionAttributeSource(false); } 之后protected生效,private不生效,aop不能代理private方法/final方法,所以不调用target的方法,所以spring注入的对象为null,所以会报NPE,studentMapper为空
    2022-11-18归属地:上海
    1
  • 安迪密恩
    我觉得可以把注解加在 saveStudent 这个方法上,要更自然一些。
    2022-03-11
    1
  • qchang
    思考题:一种是try-catch判断异常类型后,非RuntimeException抛出;另一种可以采用注解@Transactional(noRollbackFor = RuntimeException.class)
    2021-06-04
    1
  • 小林桑
    1.Spring事务默认只有runtimeexception和error才会回滚;但是可以通过transactional注解指定回滚的异常类型。 2.对私有方法加transactional注解事务不会回滚。
    2024-01-19归属地:四川
  • 番茄
    讲的非常清晰
    2023-04-24归属地:北京
  • 雨落~紫竹
    其实就分2类 一类配置问题 一类代理问题
    2022-06-22
  • Monday
    案例2中,进入doSaveStudent()方法后,抛NPE(studentMapper==null 为true)
    2021-07-19
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部