Spring的事务管理

来源:互联网 发布:淘宝直通车有效果吗 编辑:程序博客网 时间:2024/06/05 18:59

毕业也快俩个月了,作为应届毕业生深感工作不易,之前在学校学到的只是皮毛,要想前途敞亮点还是要不断的学习。之前也有用过Spring的事务管理,没有深刻的去理解,这几天做项目又有涉及,决定搞懂它。这里将对Spring事务管理做指导性的介绍,想了解具体细节还要仔细的去阅读下书籍。推荐《Spring in Action》。

事务管理简洁的解释就是:确保数据和资源不会处于一种不一致的状态。没有事务管理就可能出现数据被破坏,应用程序中的业务规则缺乏一致性。

可以用4个词来解释事务。

1、原子性:事务有一个或多个行为捆绑在一起,好像一个单独工作单元。原子性确保所有操作要么都成功,要么都不发生。都成功则提交,否则回滚。

2、一致性:一旦事务结束,系统所处状态和它业务规则保持一致,即数据不会被破坏。

3、隔离性:事务允许多个用户操作一个数据库,但一个用户的操作不会和其他用户的操作混淆。

4、持久性:一旦事务完成,事务的结果应该持久化,不管什么样的系统崩溃它们都要幸免于难。

Sping不直接管理事务,它提供许多可供选择的事务管理器,将事务管理委托给这些事务管理器,这些事务管理器管理着对应的事务。

而我们常见的事务有一下几种:JDBC事务、Hibernate事务、JPA事务、JDO事务、JTA事务等。

Spring对事务管理的支持一般有两种方式:程序控制事务管理和声明式事务管理。这里只介绍最常用也是很方便的声明式事务管理。

(以下涉及的专业名词的具体含义需要认真理解,这里只提名字,不做解释)

声明式事务管理是用事务参数来定义的,一个事务参数有5方面组成:propagation(传播行为)、isolation(隔离级别)、rollback rules(回滚规则)、time out(事务超时)、read only(只读)

propagation:传播行为定义关于客户端和被调用方法的事务边界。Spring有7种截然不同的传播行为:(1)PROPAGATION_MANDATORY  (2)PROPAGATION_NESTED  (3)PROPAGATION_NEVER  (4)PROPAGATION_NOT_SUPPORTED  (5)PROPAGATION_REQUIRED  (6)PROPAGATION_REQUIRES_NEW  (7)PROPAGATION_SUPPORTS

isolation:定义一个事务可能被其他并发事务活动影响的程度。(1)ISOLATION_DEFAULT  (2)ISOLATION_READ_UNCOMMMITTED  (3)ISOLATION_READ_COMMITTED  (4)

ISOLATION_REPEATABLE_READ  (5)ISOLATION_SERIALIZABLE

read only:是否是一个只读事务。

time out:为减少不必要的占用数据库资源的情况,限制事务在运行特定时间后自动回滚。

rollback rules:定义哪些异常引起回滚,哪些不引起回滚。

下面是Spring2.0之后的声明式事务管理的实例:

1、引入新配置元素和spring-tx.xsd模式(aop空间也要包括在内)

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

2、书写XML配置元素

<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="tx*" propagation="REQUIRED" /><tx:method name="save*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice> 

事务参数在一个<tx:attributes>中定义,它包含一个或多个<tx:method>元素,这个<tx:method>为由name参数指定的方法定义事务参数(如蓝体字部分)。事务参数就是上面所提到的5种,共6个方面:(1)isolation(2)no-rollback-for(3)propagation(4)read-only(5)rollback-for(6)timeout

在使用<tx:advice>声明一个事务时需要一个事务管理器,如2中红色字体所示。下面是hibernate3的事务管理器实例:

<!-- 定义事务管理器(声明式的事务) -->  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> 

3、完整的事务性切面。

<tx:advice>只主动定义一个AOP通知(advice),用于把事务边界通知给方法,但这只是事务通知,不是一个完全的事务性切面。我们没有在<tx:advice>中指出哪些bean应该被通知,我们需要一个用于该工作的切入点(pointcut),为了完整的定义这个事务切面,我们还要定一个通知器(advisor),这时就涉及到aop空间了。实例如下:

<aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.shhy.debit.*.service.*.*(..))" /> <aop:advisor  advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />        </aop:config> 

例子中的通知器定义通知service包下所有的service中的方法。

 

经过如上三步就配置好了一个Spring事务管理。

 

此笔记用于个人知识梳理,如有出错之处还望指出,在此谢过。