首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

SpringMVC 声明式事务学习以及有关问题解决

2014-04-29 
SpringMVC 声明式事务学习以及问题解决百度定义:声明式事务:声明式事务(declarative transaction manageme

SpringMVC 声明式事务学习以及问题解决
百度定义:
声明式事务:声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位。

首先来看看正确的完整配置:
Spring核心配置文件 applicationContext.xml



SpringMVC配置文件 spring-servlet.xml


Service层示例:(底层使用了Mybatis,在此篇不作详细介绍,具体请看下面相关URL。
TestServiceImpl.java


补充:对于use-default-filters="false"的解释:
如果不设置use-default-filters="false",则Spring会扫描并优先注册默认的bean(当然包括标记为@Service的bean),这样,标记为@Transactional的service由于transaction manager尚未注册而未能生效,导致事务管理失效。
原理是:标记为@Transactional的service会wrap为经过transactional proxied(不管是CGLIB based或是JDK based)的bean,而不再是纯的service;

问题二:若要测试事务,有很多种方式,(只要测出会回滚就行),但千万别在Service里抛出一个Exception,来做为测试事务的方式。
规则如下:
默认遇到throw new RuntimeException("...");会回滚
需要捕获的throw new Exception("...");不会回滚


原因是抛出的Exception,在数据库层默认是“超时”错误。
当然这个可以通过类似@Transactional(rollbackFor=Exception.class)的来重新配置。

-----------------------------
参考资料:
http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html

热点排行