最近看mybatis的时候做了一个练习,但是进行事务处理的时候出了问题,如下

package com.henu.lz.controller;  

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person; @Controller
public class SupplierController { @Autowired
PersonMapper personMapper; @Transactional
@RequestMapping("/add")
public String addPerson(
@RequestParam("name1") String name1,
@RequestParam("age1") int age1,
@RequestParam("name2") String name2,
@RequestParam("age2") int age2,
Model model) { Person person1 = new Person();
Person person2 = new Person();
person1.setName(name1);
person1.setAge(age1);
person2.setName(name2);
person2.setAge(age2); personMapper.save(person1);
personMapper.save(person2); model.addAttribute("message", "添加成功!");
return "success";
}
}

spring容器和springmvc的配置都没有问题,dao层就是mybatis比较与众不同的的写有sql的xml以及接口。在从前台传值的时候person1正常传,person2传能抛SQLException的值,按理说事务应该回滚的,数据库中不会有person1,但是查看数据库却有person1。用的mysql,引擎设置为innodb后还是这样,换了oracle之后依然如此。这两次save不在一个事务。

网上看了下别人的经历,有的是try…catch之后自行处理没有throw,有的是说设置rollbackFor……有一个比较接近

http://www.iteye.com/topic/714686

用的是 hibernate 3.2,在配置dao和controller的时候都用了注解方式自动扫描

<context:component-scan base-package="com..." />  

这样说是导致dao中事务无效,我试过这样配置,服务启动直接就出错了,很显然冲突,而且用context:include-filter和context:exclude-filter来屏蔽掉controller层的解决办法也有点没必要,分别扫描dao层和controller层不就行了,我是这样配置的。

查看mybatis官网上的project,是比我多了一层service层,然后在service中用的@transactional,我加了一层

package com.henu.lz.service;  

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person; @Service(value="personService")
public class PersonServiceImpl implements PersonService { @Autowired
private PersonMapper personMapper; @Transactional
public void save(Person p1, Person p2) {
personMapper.save(p1);
personMapper.save(p2);
} }

相应的,controller也修改为

package com.henu.lz.controller;  

import javax.annotation.Resource;  

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.henu.lz.model.Person;
import com.henu.lz.service.PersonService; @Controller
public class SupplierController { @Resource
private PersonService personService; @RequestMapping("/add")
public String addPerson(
@RequestParam("name1") String name1,
@RequestParam("age1") int age1,
@RequestParam("name2") String name2,
@RequestParam("age2") int age2,
Model model) { Person person1 = new Person();
Person person2 = new Person();
person1.setName(name1);
person1.setAge(age1);
person2.setName(name2);
person2.setAge(age2); personService.save(person1, person2); model.addAttribute("message", "添加成功!");
return "success";
}
}

这时再按开始那样传值能得到预期结果了。

一开始也注意到少了一层service,但是觉得在controller中做同样的事情也可以的,所以就杯具了。

因为spring的context和mvc是分开的,貌似controller不能被注册到spring的context中,于是不能被transactionManager拦截,那么controller中那个@transactional就不起作用了。看了声明式事务的五种配置,都是对注册到context中的bean起作用的,不论是拦截器方式还是aop:config方式。

事务注解方式不能应用于接口,我的mapper用的又是xml方式的,所以只能加一层service,然后controller中的交易就放在service层。

springmvc的controller中使用@Transactional无效的更多相关文章

  1. spring aop在mvc的controller中加入切面无效

    spring aop在mvc的controller中加入切面无效 因为MVC的controller,aop默认使用jdk代理.要使用cglib代理. 在spring-mybatis.xml配置文件中加 ...

  2. SpringMVC的Controller中使用线程安全的初始化

    因为SpringMVC的Controller默认是单例, 在这种情况下, Controller中使用的私有变量必须也是单例, 例如各种service, 否则会有多线程访问数据互相修改的问题. 对于需要 ...

  3. springmvc 解决 controller 中出现死循环并 stackoverflow 的问题

    这是因为这个controller中的方法返回值为void类型,且没有request response这类衍生的重定向,或者返回值为String,但是是null等等的情况,都会引起死循环,然后stack ...

  4. 在springMVC的controller中获取request,response对象的一个方法

    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...

  5. springMVC:将controller中数据传递到jsp页面

    1> 将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如: newModelAndView("/WEBINF/jsp/showData.j ...

  6. springboot项目中,@transactional 无效

    问题: springboot项目,依然是使用jpa.Hibernate来操作mysql,涉及到数据库的操作,就少不了事务.写了一个接口,用来测试@Transaction注解的作用,发现没有效果 分析: ...

  7. 9.SpringMVC和json结合传递数据 && 10.SpringMVC获取controller中json的数据

  8. SpringMVC Controller中注入Request成员域和在方法中定义中HttpServletRequest有啥区别

    先说结论,在Controller中注入Request是线程安全的. 以下是解释: 我们先来看看这两者有什么不同 在controller注入成员变量request 可以看到注入的是一个代理对象 写在方法 ...

  9. 【转】在SpringMVC Controller中注入Request成员域

    原文链接:https://www.cnblogs.com/abcwt112/p/7777258.html 原文作者:abcwt112 主题 在工作中遇到1个问题....我们定义了一个Controlle ...

随机推荐

  1. 作业七:Linux内核如何装载和启动一个可执行程序

    作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...

  2. 『编程题全队』"Gugua"事务管理系统项目宣传文案

    一.项目简介 1.项目简介 Gugua是为了解决有事务管理需要的人群的痛苦, 他们需要 一个便利和高效的个人和团体事务管理平台,但是现有的方案并没有很好地解决这些需求,我们有独特的办法是提供跨平台的软 ...

  3. Classification Truth Table

    在机器学习中对于分类结果的描述,一般有四种:true positive, true negative, false positive 和 false negative. Precision, Reca ...

  4. 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)

    1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...

  5. PLSQL 使用技巧汇总贴(一个坑)

    PLSQL是一款非常强大的工具, 只不过自己不会使用.. 1.记住密码: 首先 工具->首选项 打开 在 oracle 选项下的 登录 历史  定义 带密码存储--勾选 2. 关键字高亮 -- ...

  6. 解决因为本地代码和远程代码冲突,导致git pull无法拉取远程代码的问题

    一.问题 当本地代码和远程代码有冲突的时候,执行git pull操作的时候,会提示有冲突,然后直接终止本次pull,查了些资料没有找到强制pull的方式,但是可以使用如下方式解决. 二.解决思路 可以 ...

  7. PHP的安装,编译,扩展工具

    1.基本容易混淆的概念 pecl php的社区贡献扩展库,全称为PHP Extension Community Library, 是php的底层库, 使用C语言编写 pear php的应用扩展库,全称 ...

  8. Play on Words HDU - 1116(欧拉路判断 + 并查集)

    题意: 给出几个单词,求能否用所有的单词成语接龙 解析: 把每个单词的首字母和尾字母分别看作两个点u 和 v,输入每个单词后,u的出度++, v的入度++ 最后判断是否能组成欧拉路径 或 欧拉回路,当 ...

  9. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  10. eclipse中用maven创建web项目

    上一节中完成了本地的maven环境搭建,在eclipse中怎么创建一个maven项目呢 一.eclipse中配置maven环境 eclipse版本4.3 1.打开菜单Help->Eclipse ...