java - spring事务不回滚
问题描述
1.spring事务不会回滚,网上的方法都试过了,没有效果。2.配置如下:
1.spring.xml:<context:component-scan base-package='com.szcshl'><context:exclude-filter type='annotation' expression='org.springframework.stereotype.Controller'/> </context:component-scan>2.springmvc.xml
<context:component-scan base-package='com.szcshl' use-default-filters='false'><context:include-filter type='annotation' expression='org.springframework.stereotype.Controller'/> </context:component-scan>3.spring-hibernate.xml
<!-- 配置事务管理器 --> <bean name='transactionManager' class='org.springframework.orm.hibernate4.HibernateTransactionManager'><property name='sessionFactory' ref='sessionFactory'></property> </bean> <!-- 注解方式配置事物 --> <!-- <tx:annotation-driven transaction-manager='transactionManager' /> --> <!-- 拦截器方式配置事物 --> <tx:advice transaction-manager='transactionManager'><tx:attributes> <tx:method name='add*' /> <tx:method name='save*' /> <tx:method name='update*' /> <tx:method name='modify*' /> <tx:method name='edit*' /> <tx:method name='delete*' /> <tx:method name='remove*' /> <tx:method name='repair' /> <tx:method name='deleteAndRepair' /> <tx:method name='get*' propagation='SUPPORTS' read-only='true' /> <tx:method name='find*' propagation='SUPPORTS' read-only='true' /> <tx:method name='load*' propagation='SUPPORTS' read-only='true' /> <tx:method name='search*' propagation='SUPPORTS' read-only='true' /> <tx:method name='datagrid*' propagation='SUPPORTS' read-only='true' /> <tx:method name='*' propagation='SUPPORTS' read-only='true' /></tx:attributes> </tx:advice> <aop:config><aop:pointcut expression='execution(* com.szcshl.service..*Impl.*(..))' /><aop:advisor pointcut-ref='transactionPointcut' advice-ref='transactionAdvice' /> </aop:config>4.controller
@RequestMapping(value = '/Save' , method= RequestMethod.POST) public void departmentSave(Department department, HttpServletResponse response){ departmentService.save(department); throw new RuntimeException('抛出异常'); }5.service
@Service@Transactionalpublic class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService {@Autowired private DepartmentDao deptDao; ...... public void save(Department entity) {deptDao.save(entity); }}6.baseDao
public class BaseDaoImpl<T> implements BaseDao<T> { private SessionFactory sessionFactory; protected Class<T> entityClass; public SessionFactory getSessionFactory() {return sessionFactory; } @Resource public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory; } public Session getCurrentSession() {return this.sessionFactory.getCurrentSession(); } @SuppressWarnings('rawtypes') protected Class getEntityClass() {if (entityClass == null) { entityClass = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0];}return entityClass; } @Transactional public Serializable save(T entity) {return this.getCurrentSession().save(entity); } ......}目录结构:

问题解答
回答1:看了看,你对service接口进行事务管理,而不是controller你抛出异常是在controller,当然不会事务回滚啦
你试试在sevice实现类中,save一下,再抛个异常,看看save成功不成功
ps一下:mysql有两个存储引擎(常用),一个是InnoDB一个是MyISAM,前者支持行级锁,事务,外键,后者不支持
回答2:楼上说的没错,spring事务作用于service层,当遇到service方法抛出异常时,事务将回滚。所以你的正确测试实践应该是在service层方法中抛出异常。
相关文章:
1. javascript - [MUI 子webview定位]2. macos - mac下docker如何设置代理3. dockerfile - 为什么docker容器启动不了?4. 前端 - 怎样让scale缩小的元素不占据原来的空间?5. angular.js使用$resource服务把数据存入mongodb的问题。6. javascript - 新组成的数组打印出来出现问题,里面有对象,但长度为空7. docker - 各位电脑上有多少个容器啊?容器一多,自己都搞混了,咋办呢?8. javascript - 关于js原生事件的绑定与解除绑定9. javascript - Js对象怎么通过value值拿到key值?10. vue.js - Vue APP基于webpack的项目,它是独立的项目吗?我后台是Java的,要如何实现,跨域请求吗?大牛请教一下谢谢

网公网安备