博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC @Transactional注解方式事务失效的解决办法
阅读量:4070 次
发布时间:2019-05-25

本文共 2045 字,大约阅读时间需要 6 分钟。

项目用SpringMVC + Spring JdbcTemplate。搭框架时,发现了一个事务无法正常回滚的问题,记录如下:

首先展示问题:

Spring applicationContext.xml配置:

java:comp/env/jdbc/will
Spring mvc.dispatcher.xml(springMvc.xml)配置:

然后在Service层模拟了一个事务回滚的method case:

@Transactional      public boolean save(Person person)      {         for(int id: new int[]{2,3})          {              personDao.del(id);              int j = 1/0;          }                                   return false;      }

本以为大功告成,在运行save方法时,由于1/0 抛出 java.lang.ArithmeticException: / by zero  RuntimeException,导致事务回归,但是不生效!

查了下,发现Spring MVC对于事务配置比较讲究,需要额外的配置。解决办法如下:
需要在 applicationContext.xml增加:

在 Spring mvc.dispatcher.xml(springMvc.xml)增加:

由于web.xml中配置:

contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:/mvc_dispatcher_servlet.xml
1
dispatcher
*.do
Spring容器优先加载由ServletContextListener(对应applicationContext.xml)产生的父容器,而SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service,
因为在多上下文的情况下,如果同一个bean被定义两次,后面一个优先

经过以上分析,故可以优化上述配置

在 applicationContext.xml增加:

在 Spring mvc.dispatcher.xml(springMvc.xml)增加:

经过如上配置,成功进行了rollback。

转载地址:http://lihji.baihongyu.com/

你可能感兴趣的文章
拉格朗日插值计算器
查看>>
java中的synchronized关键字
查看>>
svn在windows下创建服务
查看>>
hibernate的二级缓存的积累
查看>>
include servlet的问题解决
查看>>
solaris下安装自动安装工工具以及环境变量设置
查看>>
solaris下安装自动安装工工具以及环境变量设置
查看>>
solaris下vi的使用 转的。。和linux下的不太一样
查看>>
solaris10下vnc的安装
查看>>
sqlserver 2005导出数据为sql的办法
查看>>
Solaris Sparcv9下jdk64位的安装
查看>>
容易忽视但是功能灰常强大的Java API
查看>>
转来的一篇关于hibernate的查询资料,很不错
查看>>
httpclient3.1下的请求头和params
查看>>
java中的image 的一些概念
查看>>
easyui中不显示出来的一个问题
查看>>
httpclient自动执行http的302重定向
查看>>
真正最正确的用BAT运行JAVA不显示DOS窗口(连闪一下都不闪)
查看>>
把log4j的日志信息打印到swing组件上
查看>>
把log4j的日志信息打印到swing组件上
查看>>