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

最新文章

  1. SQL Tuning 基础概述05 - Oracle 索引类型及介绍
  2. 中科院开源协会镜像站 Android SDK镜像
  3. 使用ExifInterface设置Datetime发生的问题
  4. vim常用命令(iOS)
  5. input属性控制弹出键盘类型
  6. C#模拟POST登录cnblogs并发布文章
  7. windows api线程
  8. [kuangbin带你飞]专题十 匹配问题
  9. 3月3日(4) Remove Duplicates from Sorted List
  10. angularjs Failed to read the &#39;selectionStart&#39; property from &#39;HTMLInputElement&#39;:
  11. linux修改时间 时区
  12. android5.0问题
  13. 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
  14. sendmail服务器的安装
  15. XML相关概念
  16. 给 chorme Developer Tool F12 开发者工具.加入更酷的代码着色
  17. chrome浏览器调试功能之后端篇
  18. Learning to Rank(转)
  19. [openjudge-搜索]Knight Moves(翻译与题解)
  20. jxl(Java Excel API) 使用方法 【1】

热门文章

  1. docker系列之六容器数据卷
  2. SQL将同样标识的查询结果查重并用逗号拼接
  3. Go微服务 grpc的简单使用
  4. c#开启线程池超出索引
  5. js 概述 ( 一 )
  6. 使用了frame的页面如何整体进行跳转,而不是仅frame跳转
  7. Linux基本命令-chmod
  8. javascript获取用户按了哪个键
  9. wav音频的剪切
  10. cmd生成大文件