Spring的事务管理基础情况(六)

JavaEE应用的传统事务有两种策略:全局事务和局部事务。

全局事务由应用服务器管理,需要底层服务器的JTA的支持。

局部事务和底层所采用的持久化技术有关,当采用JDBC持久化技术时,需要使用Connection对象来操作事务;而采用Hibernate持久化技术时,需要使用Session对象来操作事务。

(全局)JTA: Transaction tx = ctx.lookup(); tx.commit()、tx.rollback()
(局部)JDBC: Connection conn = getConnection();
Conn.setAutoCommit(false); conn.commit()、conn.rollback();
(局部)Hibernate: Session se = getSession();
Transaction tx = se.beginTransaction(); tx.commit()、tx.rollback();


Spring的PlatformTransactionManager接口:
TransactIonStatus  getTransaction( TransactionDefinition definition ) throws  TransactionException;
void  commit( TransactionStatus status )  throws  TransactionException;
void  rollback( TransactionStatus status )  throws  TransactionException;


Spring 提供两种事务管理方式:
编程式事务管理:即使利用Spring编程式事务时,程序也可直接获取容器中的通过该接口所提供的3个方法来开始事务,提交事务、回滚事务。
声务管理明式事:无需在Java程序中书写任何的事务操作代码,而是通过在XML文件中为业务组件配置事务代理(AOP代理的一种),AOP为事务代理所织入的增强处理也由Spring提供:在目标方法执行之前,织入开始事务;在目标方法执行之后,织入结束事务。


大部分时间,推荐使用声明式事务,优势很明显:
大大降低了开发者代码书写量,声明式事务几乎不影响应用的代码。
应用程序代码无须任何事务处理代码,可以更专注于业务逻辑的实现。
Spring则可对任何POJO的方法提供事务管理,而且Spring的声明式事务管理无需容器的支持,可以在任何环境下使用。
EJB的CMT无法提供声明式回滚规则;而通过配置文件,Spring可指定事务在遇到特定异常时自动回滚。Spring不仅可以在代码中使用setRollbackOnly回滚事务,也可以在配置文件中配置回滚规则。
由于Spring采用AOP的方式管理事务,因此,可以在事务回滚动作中插入用户自己的动作,而不仅仅是执行系统默认的回滚。


声明式事务管理使用TransactionProxyFactoryBean来配置事务代理Bean。这个是基于Spring的AOP,为一个目标Bean生成一个事务代理Bean。事务代理的方法改写了目标Bean的方法,就是在目标Bean方法执行之前加入开始事务,在目标Bean的方法正常结束之前提交事务,遇到异常就回滚。


对于Spring2.X以后可以采用tx命名空间来配置事务增强处理。下面我们将给出一个例子:
……
<xmlns:aop=”http://……………………/shema/aop”>
< xmlns:tx=”http://……………………/schema/tx”>
……
<!---  配置事务增强处理的Bean,指定事务管理器 --
<tx:advice  id = “txAdvice”
Transaction-manager=”transactionManager”>
<!—用于配置详细的事务语义 -->
<tx:attributes>
<!--- 所有以‘get’ 开头的方法时read-only的-->
< tx:method  name=”get*”  read-only=”true” />
<!--- 其他方法使用默认的事务设置 -->
<tx:method  name=”*”  />
</tx:attributes>
</tx:advice>
<!--- AOP配置元素  -->
<aop:config>
<!--- 配置一个切入点,匹配一个包下所有Impl结尾的类里所有方法的执行 -->
<aop:pointcut  id=”myPoingtcut”
Expression=”execution(* org.xxx.xxx.xxx.dao.impl.*Impl.*(…)) ”/>
<!--- 指定在txAdvice切入点应用txAdvice事务增强处理 -->
<aop:advisor  advice-ref=”txAdvice”  pointcur-ref=”myPointcut”  />
<aop:config>


使用@Transactional
Spring还允许将事务配置设置放在Java类中,这需要借助于@Transactional Annotation,该Annotation既可用于修饰Spring Bean类,也可以用于修饰Bean类中的某个方法。
如果使用@Transaction修饰Bean类,表明这些事务设置对整个Bean类起作用,如果使用@Transaction修饰Bean类的某个方法,表明这些事务设置只对该方法有效。
@Transaction可以指定如下的方法:
isolation:用于指定事务的隔离级别;默认为底层事务的隔离级别。
noRollbackFor:指定遇到指定异常时强制不回滚事务。
noRollbackForClassName:指定遇到指定多个异常时强制不回滚事务。该属性值可以指定多个异常类名。
Propagation:指定事务的传播属性;
readOnly:指定事务是否只读;
rollbackFor:指定遇到指定异常时强制回滚事务。
rollbackForClassName:强制指定遇到指定多个异常时回滚。
timeout:指定事务超时时长。
例如:


在类里面加入修饰符
@Transactional(propagation=Propagation.Required)
Public  void  insert( String title, String content ){
……
}

然后再Spring的配置文件中加入
<tx:annotation-driven  transaction-manager=”transactionManager”>








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值