spring mvc+mybatis 事务控制不起作用

问题描述

用的是spring mvc和mybatis框架。数据库是mysql。然后发现事务配置了不起作用。。业务逻辑是新增用户,用户新增成功之后再在其他表插入一条对应的用户角色关联信息。现在问题是假如用户插入成功之后。。插入对应的用户角色关联信息出错后,用户那条新增记录不能自动删除。看了很多人说是因为@service提前扫描的问题。那个我改过了。还有说是表的引擎不是InnoDB。但是我们建的表是InnoDB。还有说要抛出RuntimeException。我也抛出了。。但是还是没用。没办法。请大家看下:-serlet.xml:<mvc:resources mapping="/resources/**" location="/resources/" /> <context:annotation-config /> <mvc:annotation-driven /> <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --> <context:component-scan base-package="com.xuanyan.uebuycar.*"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="webBindingInitializer"> <bean class="com.xuanyan.uebuycar.admin.util.WebDataBinder4DateAndTime"/> </property> </bean> <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".html"/> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/> applicationContext.xml:<!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象 --><bean class="com.xuanyan.uebuycar.admin.util.SpringContextHolder" lazy-init="false" /><!-- define the SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="proxool" /><property name="configLocation" value="classpath:mybatis-config.xml" /></bean><!-- 数据连接事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="proxool" /></bean> <!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 --> <context:component-scan base-package="com.xuanyan.uebuycar"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan> <!-- 激活annotation功能 --><context:annotation-config /><!-- 激活annotation功能 --><context:spring-configured/><!-- mybatis接口 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.xuanyan.uebuycar.admin.dao" /></bean><!-- 连接事务的注解配置 --> <tx:annotation-driven transaction-manager="transactionManager" /> <aop:config proxy-target-class="true"><aop:pointcut id="fooServiceOperation"expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" /></aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- the transactional semantics... --><tx:attributes><tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/></tx:attributes></tx:advice>方法:public String addOrUpdate(SysUser record,SysUser currUser,String actionType,String roleId){String str=getDefJsonString(false, "操作失败,请稍后再试!");try {if(record!=null){Date now=new Date();SysUserExample example=new SysUserExample();example.createCriteria().andUserCodeEqualTo(record.getUserCode());List<SysUser> list=sysUserMapper.selectByExample(example);if("add".equalsIgnoreCase(actionType)){if(list!=null&&list.size()>0){str=getDefJsonString(false, "操作失败,该账号已存在!");return str;}String userId=CommonUtil.getUUIDString();record.setUserId(userId);record.setUserPassword(CommonUtil.getMD5Str(SystemCommonParam.DEFAULT_USER_PWD));record.setUpdateUser(currUser.getUserCode());record.setUpdateTime(now);if(sysUserMapper.insertSelective(record)>0){SysRoleUser ru=new SysRoleUser();//ru.setRoleUserId(CommonUtil.getUUIDString());ru.setRoleId(roleId);ru.setUserId(userId);ru.setUpdateUser(currUser.getUserCode());ru.setUpdateTime(now);if(sysRoleUserMapper.insertSelective(ru)>0){str=getDefJsonString(true, "新增成功!");}}}else if("edit".equalsIgnoreCase(actionType)){if(list!=null&&list.size()>0){if(!list.get(0).getUserId().equals(record.getUserId())){str=getDefJsonString(false, "操作失败,该账号已存在!");return str;}}record.setUpdateUser(currUser.getUserCode());record.setUpdateTime(now);if(sysUserMapper.updateByPrimaryKeySelective(record)>0){SysRoleUser ru=new SysRoleUser();ru.setRoleId(roleId);SysRoleUserExample ex=new SysRoleUserExample();ex.createCriteria().andUserIdEqualTo(record.getUserId());if(sysRoleUserMapper.updateByExampleSelective(ru, ex)>0){str=getDefJsonString(true, "修改成功!");}}}}} catch (Exception e) {str=getDefErrorString();e.printStackTrace();throw new RuntimeException();}return str;}类路径:com.xuanyan.uebuycar.admin.services.sys.SysUserService希望各位有知道能够告知一下。。是不是我service方法写的不对?

解决方案

<aop:pointcut id="fooServiceOperation" expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" /> com.xuanyan.uebuycar.admin.services.sys.SysUserService 1、先在控制器中通过AopUtils.isAopProxy 看看你注入的是不是代理对象 再来分析
解决方案二:
1、mysql存储引擎要为innodb2、方法不用try catch,或者catch的异常为RunException或者DataAccessException,因为为exception的时候,异常没法捕获满足以上两点,相信你的问题就解决了!!!

时间: 2024-09-29 14:42:48

spring mvc+mybatis 事务控制不起作用的相关文章

spring mvc +hibernate4事务控制问题求大神解答

问题描述 spring mvc +hibernate4事务控制问题求大神解答 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="

spring mvc+hibernate4事务控制

问题描述 spring mvc+hibernate4事务控制 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://

spring data jpa + spring mvc的事务控制问题

问题描述 spring data jpa + spring mvc的事务控制问题 问题大概是这样的,如下@Transactionalpublic void save(A a){ a = aRepository.save(a); B b = new B();b.setAId(a.getId());bRepository.save(b); }这样是获取不到a对象的id的,因为方法没有执行完,这个事务没有提交,数据没有更新到数据库,请问如果我想在save之后通过返回的对象就能拿到主键需要怎么做,事务是

Spring MVC+Mybatis+Maven+Velocity+Mysql 连不上数据库

问题描述 Spring MVC+Mybatis+Maven+Velocity+Mysql 连不上数据库 我的mysql没有设置密码 本地数据库可以 直接登上去的 项目里面就是连不上说密码错误 是什么原因 解决方案 解决方案二: 别的密码也试过了 反正都是本地用nativecat可以登上去 项目里面运行的时候一直都是密码错误 解决方案三: Spring MVC+Mybatis+Maven+Velocity+Mysql 解决方案四: jia qun 482547245

spring- Jersey+Spring mvc + mybatis 实现rest 接口

问题描述 Jersey+Spring mvc + mybatis 实现rest 接口 java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineC

新手求问,关于spring MVC+mybatis 的数据查询。。。

问题描述 新手求问,关于spring MVC+mybatis 的数据查询... 解决方案 select count(1),type from table group by type 解决方案二: 这个和springmvc以及mybatis没有关系,,只是一个逻辑的问题而已,查询后按不同的name统计不就可以了吗

spring mvc+mybatis框架使用怎么ajax无刷新批量上传图片?

问题描述 spring mvc+mybatis框架使用怎么ajax无刷新批量上传图片? spring mvc+mybatis框架怎么使用ajax无刷新批量上传图片?上传之后显示,哪位大神能不能给个demo,谢谢! 解决方案 Mvc Ajax 图片上传

sping hibernate 事务-spring注解方式事务控制没有回滚

问题描述 spring注解方式事务控制没有回滚 项目中使用到了hibernate以及spring事务控制,在service层增加事务控制但是遇到异常没有回滚. 代码如下: 配置文件 <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfr

我用spring mvc+mybatis整合为什么出这个错误,是不是路径错误?我是新手,请大神指教

问题描述 我用spring mvc+mybatis整合为什么出这个错误,是不是路径错误?我是新手,请大神指教 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:JAVANewWorkspace.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebappsstudent