Spring的事务管理机制

Spring对事务管理的支持

与EJB相似,Spring提供了对编码式声明式事务管理的支持。可是,Spring对事务管理的能力远远超过EJB。这里就不详细介绍编码式事务和声明式事务的区别了。有兴趣的读者能够自行Google。java

Spring对事务管理是经过事务管理器来实现的。Spring提供了许多内置事务管理器实现:spring

事务管理器
(org.springframework.*)
使用场景
DataSourceTransactionManager 数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
JdoTransactionManager 提供对单个javax.jdo.PersistenceManagerFactory事务管理,用于集成JDO框架时的事务管理;
JpaTransactionManager 提供对单个javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的事务管理;
HibernateTransactionManager 提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
JtaTransactionManager 提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器事务管理器;
OC4JjtaTransactionManager Spring提供的对OC4J10.1.3+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;
WebSphereUowTransactionManager Spring提供的对WebSphere 6.0+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;
WebLogicJtaTransactionManager Spring提供的对WebLogic 8.1+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持。

transaction-managers

以上就是Spring中支持使用的事务管理器,通常咱们比较经常使用的就是HibernateTransactionManagerDataSourceTransactionManager。咱们在使用事务的时候要声明要使用哪一种事务管理器。如:sql

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

事务属性

spring中,声明事务是经过事务属性来定义的。事务属性描述了事务策略如何应用到方法上事务属性包含5个方面:数据库

传播行为后端

隔离级别服务器

回滚规则并发

事务超时框架

是否只读分布式

transaction-property

这里简单介绍一下这五个属性。优化

传播行为

传播行为定义了客户端与被调用方法之间的事务边界,即传播规则回答了这样的一个问题,新的事务应该被启动仍是挂起,或者方法是否要在事务环境中运行。(后面会有单独的文章介绍该属性)

隔离级别

隔离级别定义了一个事务可能受其余并发事务影响的程度。多事务并发可能会致使脏读、幻读、不可重复读等各类读现象。(具体参考:数据库的读现象浅析)

ISOLATION_DEFAULT:使用后端数据库默认的规则

ISOLATION_READ_UNCOMMITTED:容许读取还没有提交的数据变动,可能会致使脏读,幻读或不可重复读

ISOLATION_READ_COMMITTED:容许读取并发事务已经提交的数据,能够防止脏读,可是幻读或不可重复读仍有可能发生

ISOLATION_REPEATABLE_READ:对赞成字段的屡次读取结果是一致的,除非数据是被本事务本身所修改,看阻止脏读和不可重复读,但幻读仍有可能发生

ISOLATIOM_SERIALIZABLE:彻底服从ACID的隔离级别,确保阻止脏读,不可重复读以及幻读,这是最慢的数据隔离级别

(具体参考:深刻分析事务的隔离级别

是否只读

若是事务只对后端的数据库进行读操做,数据库能够利用事务ID只读特性来进行一些特定的优化。经过将事务设置为只读,你就能够给数据库一个机会,让他应用它认为合适的优化措施。由于是否只读是在事务启动的时候由数据库实施的,因此只有对那些具有可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED)的方法来讲,才有意义。

事务超时

为了使应用程序很好地运行,事务不能运行太长时间。由于超时时钟会在事务开始时启动,因此只有对那些具有可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED)的方法来讲,才有意义。

事务回滚

事务回滚规则定义了哪些异常会致使事务回滚而哪些不会。默认状况下,事务只有在遇到运行时期异常才回滚,而在遇到检查型异常时不会回滚。

配置方式

事务属性的配置方式经过如下关键字来指定:

关键字 含义
isolation 指定事务的隔离级别
propagation 定义事务的传播规则
read-only 指定事务为只读
rollback-for
no-rollback-for
rollback-for指定事务对哪些检查型异常应当回滚而不提交
no-rollback-for指定事务对哪些异常应当继续执行而不回滚
timeout 对于长时间运行的事务定义超时时间

XML中事务属性的配置方式以下:

<tx:advice id="txAdvice" transactionmanager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
</tx:advice>

注解中事务属性的配置方式以下:

@Transaction(propagation=Propagation. REQUIRED,readOnly=true)
public void add(String username){
    //...
}

总结

事务是企业应用开发中很重要的组成部分,他让软件变得更加健壮。他保证了全有或全无的操做。

Spring同时支持编码式和声明式事务管理,不管使用哪一种方式进行事务管理,都应该知道与事务相关的五个属性。

相关文章
相关标签/搜索