<bean id="tx_manager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="tx_manager" />
Spring事物管理
@Transactional(propagation = Propagation.MANDATORY)---强制的(必须有transaction)
@Transactional(propagation = Propagation.NESTED)----------内嵌的transaction
@Transactional(propagation = Propagation.NEVER)------------绝不能有transaction
@Transactional(propagation = Propagation.NOT_SUPPORTED)--方法要执行,遇到的transaction挂起。
@Transactional(propagation = Propagation.REQUIRED) --------------必须的(默认的)
@Transactional(propagation = Propagation.REQUIRES_NEW)---------方法要执行,遇到的transaction挂起,创建新的transaction。
@Transactional(propagation = Propagation.SUPPORTS)----------------有没有无所谓
============================================================================================
<!-- ^^^^^^^^^^^^^^^^^^^^^^^^^^ AOP ^^^^^^^^^^^^^^^^^^^^^^^^^^ -->
<!-- AOP 动态代理 代理切点类 (例:userDAO) -->
<tx:advice id="tx_Advice" transaction-manager="tx_manager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="servicePointCut"
expression="execution(* com.cui.service..*(..))" />
<aop:advisor pointcut-ref="servicePointCut" advice-ref="tx_Advice" />
</aop:config>
使用基于注解的AOP的事务管理
@Transactional
1. 例子
Transactional(readOnly = true, propagation=Propagation.REQUIRED)
@Transactional(propagation=Propagation.REQUIRED)
public TradeData placeTrade(TradeData trade) throws Exception {...}
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public TradeData placeTrade(TradeData trade) throws Exception {...}
2. xml 配置
<beans>
<tx:annotation-driven transaction-manager="transactionManager"/>
//使用@Transactional 注解创建恰当的事务管理切面
<aop:aspectj-autoproxy/>// 通知匹配的bean
<beans>
3. <tx:annotation-driven>标签
<tx:annotation-driven>标签是使用注解驱动的事务管理支持的核心, 所有属性如下
transactionManager: 指定到现有的PlatformTransactionManger bean 的引用, 通知会使用该引用
mode: 指定spring事务管理框架创建通知bean的方式,可用的有proxy 和 aspectj, 前者是默认值, 表示通知对象是个jdk代理,后者表示spring aop会使用ajpectj创建代理
order: 指定创建切面的顺序, 只要目标对象有多个通知就可以使用该属性
proxy-target-class: 该属性如果为true , 就表示你想要代理目标类而不是bean 所实现的所有接口
4. @Transactional
所有属性
propagation: 指定事务定义中使用的传播
isolation: 指定事务的隔离级别
timeout: 超时时间
readonly : 如果为true, 事务标致为只读
noRollbackFor: 目标方法可抛出的异常所构成的数组,但通知仍会提交事务
rollbackFor: 异常所构成的数组,如果目标方法抛出了这些异常,通知就会回滚
5. 缺点
a. 不的不为所有需要事务的方法加上@Transactional
b. 把@Transactional 加在整个类上, 不需要事务的方法也运行在事务中