您的位置:首页 > 编程语言 > Java开发

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与事务属性关联的方法名。
propagationREQUIRED事务传播行为
isolationDEFAULT事务隔离级别
timeout-1事务超时时间,以秒为单位
readonlyfalse事务是否只读
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-managertransactionManager使用的事务管理器的名字。
modeproxy默认的模式“proxy”会用Spring的AOP框架来代理注解过的bean;另一种可行的模式“aspectj”会使用Spring的AspectJ事务切面来编织类
proxy-target-classfalse只对代理模式有效。决定为那些使用了@Transactional注解的类创建何种事务代理。 如果 “proxy-target-class” 属性被设为 “true”, 那么基于类的代理就会被创建。如果 “proxy-target-class”属性被设为”false” 或者没设,那么基于接口的标准JDK代理就会被创建。
orderOrdered.LOWEST_PRECEDENCE定义事务通知的顺序会作用到使用@Transactional注解的bean上
@Transactional注解的属性

属性类型描述
propagation枚举型:Propagation可选的传播性设置
isolation枚举型:isolation可选的隔离性级别(默认值:ISOLATION_DEFAULT)
readOnly布尔型读写型事务 vs. 只读型事务
timeoutint型(秒为单位)事务超时
rollbackFor一组 Class 类的实例,必须是Throwable 的子类一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚
rollbackForClassname一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须进行回滚
noRollbackFor一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须不回滚
noRollbackForClassname一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须不回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 事务