Spring声明式事务管理的两种方式(XML和Annotation)
2016-03-10 17:15
351 查看
Spring声明式事务管理
Spring的声明式事务管理是通过Spring AOP实现的,Spring提供了声明式的回滚规则:我们可以自己指定什么样的异常会导致回滚。XML版配置
<!-- AOP事务管理start。。。 --> <!--HibernateTransactionManager类中有setSessionFactory(),将sessionFactory注入--> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--将我们想要施加在事务中的语义封装在<tx:advice/>中,其中默认的设置为:事务性传播设置是REQUIRED;隔离级别为DEFAULT;事务是读/写;事务超时默认是依赖于事务系统的,或者事务超时没有被支持;任何 RuntimeException将触发事务回滚,但是任何checked Exception 将不触发事务回滚。--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="test*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--设置一个pointcut确保由"txAdvice"bean定义的事务通知在应用中合适的点来执行,然后使用一个通知器(advisor)将该切面与txAdvice绑定到一起,其中expression的属性是织入点语法,com.niu.service包下任意包(..)的任意实现类(*)的任意方法(*)参数任意(..)--> <aop:config> <aop:pointcut expression="execution(public * com.niu.service..*.*(..))" id="transactionAop"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionAop"/> </aop:config> <!-- AOP事务管理end。。。 -->
以上配置为service层的一些方法加入了事务管理,当它们被调用时,一个事务将被启动、挂起、被标记为只读,或者其他(取决于你定义的语义)。
回滚规则:
<!--指定异常回滚类型--> <tx:method name="save*" propagation="REQUIRED" rollback-for="NoProductInStockException"/> <!--即使遇到没有经过处理的InstrumentNotFoundException异常,也不要回滚事务--> <tx:method name="save*" propagation="REQUIRED" no-rollback-for="InstrumentNotFoundException"/>
<tx:method>设置
属性 | 是否需要 | 默认值 | 描述 |
---|---|---|---|
name | 是 | 与事务属性关联的方法名。 | |
propagation | 不 | REQUIRED | 事务传播行为 |
isolation | 不 | DEFAULT | 事务隔离级别 |
timeout | 不 | -1 | 事务超时时间,以秒为单位 |
readonly | 不 | false | 事务是否只读 |
rollback-for | 不 | 将被触发回滚的Exception,以逗号隔开 | |
no-rollback-for | 不 | 不被触发回滚的Exception,以逗号隔开 |
注解版配置
<beans xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation= "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!--启动注解版事务管理开关--> <tx:annotation-driven transaction-manager="txManager"/> <beans/>
在xml中的配置工作就完成了,将@Transactional标签加入需要开启事务管理的接口定义、接口方法、类定义、类方法(public)上。注:@Transactional只是一种元数据,根本在于tx:annotation-driven标签开启了事务。建议将@Transactional 使用在具体类(方法)上。
tx:annotation-driven配置
属性 | 默认值 | 描述 |
---|---|---|
transaction-manager | transactionManager | 使用的事务管理器的名字。 |
mode | proxy | 默认的模式“proxy”会用Spring的AOP框架来代理注解过的bean;另一种可行的模式“aspectj”会使用Spring的AspectJ事务切面来编织类 |
proxy-target-class | false | 只对代理模式有效。决定为那些使用了@Transactional注解的类创建何种事务代理。 如果 “proxy-target-class” 属性被设为 “true”, 那么基于类的代理就会被创建。如果 “proxy-target-class”属性被设为”false” 或者没设,那么基于接口的标准JDK代理就会被创建。 |
order | Ordered.LOWEST_PRECEDENCE | 定义事务通知的顺序会作用到使用@Transactional注解的bean上 |
属性 | 类型 | 描述 |
---|---|---|
propagation | 枚举型:Propagation | 可选的传播性设置 |
isolation | 枚举型:isolation | 可选的隔离性级别(默认值:ISOLATION_DEFAULT) |
readOnly | 布尔型 | 读写型事务 vs. 只读型事务 |
timeout | int型(秒为单位) | 事务超时 |
rollbackFor | 一组 Class 类的实例,必须是Throwable 的子类 | 一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚 |
rollbackForClassname | 一组 Class 类的名字,必须是Throwable的子类 | 一组异常类名,遇到时必须进行回滚 |
noRollbackFor | 一组 Class 类的名字,必须是Throwable的子类 | 一组异常类名,遇到时必须不回滚 |
noRollbackForClassname | 一组 Class 类的名字,必须是Throwable的子类 | 一组异常类名,遇到时必须不回滚 |
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- SQL Server误区30日谈 第1天 正在运行的事务在服务器故障转移后继续执行
- 浅析SQL Server中包含事务的存储过程
- Mysql中的事务是什么如何使用
- MySql的事务使用与示例详解
- C#分布式事务的超时处理实例分析
- C#中的事务用法实例分析
- SQL Server的事务操作隔离模式介绍
- MySQL中事务概念的简洁学习教程
- C#处理Access中事务的方法
- oracle 合并查询 事务 sql函数小知识学习
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- sql不常用函数总结以及事务,增加,删除触发器
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的