Spring的事务管理中使用@Transactional这一annotation来对事务进行声明式的设定

具体而言,就是在类或者方法前添加@Transactional并传入属性参数以获取所需要的Transaction特性。

项目中的**.xml 配置文件:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="call*" propagation="REQUIRES_NEW" />
			<tx:method name="*" propagation="REQUIRED" />
		</tx:attributes>
</tx:advice>

<aop:config proxy-target-class="true">
		<aop:pointcut id="txPointcutSvc"
			expression="execution(* net.mi..*Service.*(..))" />
		<aop:pointcut id="txPointcutHdl"
			expression="execution(* net.mi..*Handler.*(..))" />
		<aop:pointcut id="txPointcutFacade"
			expression="execution(* net.mi.pepp.common.tx.TxFacade.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcutSvc" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcutHdl" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcutFacade" />
</aop:config>



Spring中的@Transactional有5个属性:

 Propagation、Isolation、Rollback Rules、Timeout和Read-Only


其中Propagation属性定义了Transaction的边界 — 是否使用Transaction、在Transaction已存在的情况下如何表现等。


Propagation属性


@Transactional中Propagation属性有7个选项可供选择:


Propagation.MANDATORY 。当前方法必须在已经定义的Transaction中运行,如果没有已定义的Transaction则抛出异常。
Propagation.NESTED 。如果没有已定义的Transaction,当前方法新开一个Transaction并在该Transaction中运行。如果存在已定义的Transaction,当前方法在嵌套事务(Nested Transaction)中运行 — 嵌套事务中可以定义储存点,因此可以独立于外部的Transaction而进行rollback。
Propagation.NEVER 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction则抛出异常。
Propagation.NOT_SUPPORTED 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction,则该Transaction暂停(挂起)直至该方法运行完毕。
Propagation.REQUIRED 。 默认值 。当前方法必须在Transaction中运行。如果存在已经定义的Transaction,则该方法在已定义的Transaction中运行;如果不存在已经定义的Transaction,则该方法新开一个Transaction并在其中运行。
Propagation.REQUIRES_NEW 。当前方法必须在新开的Transaction中运行。如果存在已经定义的Transaction,则该已定义的Transaction暂停直至新开的Transaction执行完毕。
Propagation.SUPPORTS 。当前方法不需要在Transaction中运行,但如果存在已经定义的Transaction,则该方法也可以在Transaction中正常执行。


Propagation属性实例


观察以下两个定义了@Transactional的方法,innerMethod()模拟了Transaction已经存在的情况,outMethod()则模拟了不存在已定义Transaction的情况:


@Transactional
public void outMethod() {
    exampleDAO.doSomething();
    innerMethod();
}


@Transactional
public void innerMethod() {
    exampleDAO.doElse();
}
对于这两个方法,定义不同的Propagation属性值所产生的效果如下(Propagation.NESTED的情况较为复杂,在此忽略): 
Propagation属性 outMethod innerMethod
Propagation.MANDATORY .抛出异常 .在outMethod的Transaction中运行
Propagation.NEVER .不在Transaction中运行 .抛出异常
Propagation.NOT_SUPPORTED .不在Transaction中运行 .outMethod的Transaction暂停直至innerMethod执行完毕
Propagation.REQUIRED ( 默认值 ) .新开一个Transaction并在其中运行 .在outMethod的Transaction中运行
Propagation.REQUIRES_NEW .新开一个Transaction并在其中运行 .outMethod的Transaction暂停直至innerMethod中新开的Transaction执行完毕
Propagation.SUPPORTS .不在Transaction中运行 .在outMethod的Transaction中运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值