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. java 排序的问题2. 网络传输协议 - 以下三种下载方式有什么不同?如何用python模拟下载器下载?3. 我在centos容器里安装docker,也就是在容器里安装容器,报错了?4. 如何修改phpstudy的phpmyadmin放到其他地方5. 我的html页面一提交,网页便显示出了我的php代码,求问是什么原因?6. angular.js - Angular路由和express路由的组合使用问题7. node.js - gulp文件监听的问题8. django - 后台返回的json数据经过Base64加密,获取时用python如何解密~!9. tp6表单令牌10. php - mysql中,作为主键的字段,用int类型,是不是比用char类型的效率更高?
