@Transactional注解不生效的原因总结(整理网上和自己遇到的解决方案)
1、问题背景
今天做项目,发现配置好@Transactional后,没有生效,事务没有回滚,即便在网上查资料,也没有解决,好像网上没有人发过我遇见的这种情况的帖子。
2、自己遇到的情况分析
代码结构图

控制层代码
@RequestMapping("/update")
@ResponseBody
public Object updateStu(int age) {
try {
transactionService.updateStudent(age);
return "success";
} catch (Exception e) {
return e.getMessage();
}
}
TransactionServiceImpl内代码
@Service
public class TransactionServiceImpl implements TransactionService { @Resource
StudentServiceImpl studentService; @Transactional(rollbackFor = Exception.class)
public void updateStudent(int age) {
Student stu1 = studentService.getStudentById(1);
Student stu2 = studentService.getStudentById(2);
stu1.setAge(age);
stu2.setAge(age);
studentService.updateStudent(stu1);
int a = 1 / 0;
studentService.updateStudent(stu2);
}
}
applicationContext.xml中配置事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
最开始spring-mvc.xml配置的扫描包是:<context:component-scan base-package="com.zhi">,当运行程序后,访问controller,第一个更新操作事务没有回滚。
最后查找问题原因,是spring-mvc的包扫描问题。
启动程序,现根据spring监听创建spring上下文,在spring扫描包的时候,会将TransactionServiceImpl对象放进spring上下文中。然后程序会继续加载springmvc的配置,创建springmvc上下文,这是扫描包时,会将TransactionServiceImpl对象放入springmvc上下文中。当访问接口时,是由springmvc上下文中的controller从springmvc上下文中获取到TransactionServiceImpl对象。当执行到@Transactional注解的方法时,spring aop会判断是否创建代理对象。问题就在这里,因为事务在spring上下文中配置,但是获取到的对象时在springmvc上下文中,所以spring无法创建代理对象,因此@Transactional注解最终不会生效。
3、其他@Transactional不生效原因
参考:https://blog.csdn.net/qq_20597727/article/details/84900994
@Transactional注解不生效的原因总结(整理网上和自己遇到的解决方案)的更多相关文章
- @Transactional注解不回滚原因详解
最近试了试spring的回滚功能,根据网上的教程配置怎么都不好使,遂寻找答案, 网上的答案都是这么讲的: 1. 检查你方法是不是public的. 2. 你的异常类型是不是unchecked异常.如果我 ...
- Spring @Transactional注解不起作用解决办法及原理分析
Transactional失效场景介绍 第一种 Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用.例如以下代码. 定义一个错误的@Trans ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
- Spring注解不生效原因总结
在Spring的注解学习中发现使用(@Resource.@PostConstruct. @PreDestroy)这三个注解时不生效.使用@Resource发生空指针异常,说 明被注解对象没有被成功注入 ...
- Spring对于事务的控制@Transactional注解详解
引用自:https://blog.csdn.net/fanxb92/article/details/81296005 先简单介绍一下Spring事务的传播行为: 所谓事务的传播行为是指,如果在开始当前 ...
- 一口气说出 6种,@Transactional注解的失效场景
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...
- @Transactional注解失效的解决方案
一.前言 开发中我们经常使用 @Transactional注解来启用Spring事务管理,但是如果使用方法不当,会遇到注解不生效该事务回滚的地方却没有回滚的问题. 总结下一般是以下几个原因: @Tra ...
- 数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- Spring声明式事务管理基于@Transactional注解
概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解. 第一种方式我已在上文为大 ...
随机推荐
- elementui更改导航栏样式
本来是这样,有下划线有点击背景,但是业务需求不需要,就想办法进行隐藏,控制台可以观察效果找出相应的类进行格式书写 以下效果: 放上代码 <style> .el-menu-demo{ hei ...
- 基2时抽8点FFT的matlab实现流程及FFT的内部机理
前言 本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好, 还是老实调IP吧,了解内部机理即可,无需重复发明轮子. 参考 https:// ...
- 【推荐】 Neutralizer 安卓上特殊的均衡器
首先 直切正题 这个均衡器特殊就特殊在 会产生 特定频率的声音 根据声音来调整 自己喜欢的声音 下载地址: https://d-02.apkplz.org/dl.php?s=czlDeEt ...
- C语言程序经过编译链接后形成二进制映像文件的组成
C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...
- 查看flask中所有的路由信息(同时查看/设置允许的请求方式get、post)
查看flask中所有的路由信息(同时查看/设置允许的请求方式get.post) # -*- coding: utf-8 -*- from flask import Flask app = Flask( ...
- 转:基于Maven管理的JavaWeb项目目录结构参考
通常在创建JavaWeb项目时多多少少都会遵循一些既定的比较通用的目录结构,下面分享一张基于Maven管理的JavaWeb项目目录结构参考图: 上图仅是参考,不同项目不同团队都有自己的约定和规范. 个 ...
- 05 Windows编程——Windows程序框架
源码 #include<Windows.h> LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARA ...
- python实现pow函数(求n次幂,求n次方)
目录 类型一:求n次幂 类型二:求n开方 类型一:求n次幂 实现 pow(x, n),即计算 x 的 n 次幂函数.其中n为整数.pow函数的实现--leetcode 解法1:暴力法 不是常规意义上的 ...
- [ 转载 ] Android设计模式详解
从Android再来认识23种设计模式 ReadyShow 关注 0.2 2018.01.06 23:18* 字数 3855 阅读 2584评论 0喜欢 20 概况来看本文章的内容 创建型:5个 单 ...
- for循环使用后contains方法失去效果
重写了cartInfo中的equals和hashcode方法 第一种方式:包含是可以的List<CartInfo> cookie = new ArrayList<CartInfo&g ...