Spring中的声明式事务

举报
晴天X风 发表于 2018/03/14 20:30:24 2018/03/14
【摘要】 Spring中的声明式事务事务配置配置涉及3个方面数据源data source事务管理器transaction manager代理机制持久层不同,配置的变化如下JDBCHibernateJPA数据源DataSourceSessionFactoryEntityManager事务管理器DataSourceTransactionManagerHibernateTransactionManagerJpaT

Spring中的声明式事务


事务配置

配置涉及3个方面

  • 数据源data source

  • 事务管理器transaction manager

  • 代理机制

持久层不同,配置的变化如下


JDBCHibernateJPA
数据源DataSourceSessionFactoryEntityManager
事务管理器DataSourceTransactionManagerHibernateTransactionManagerJpaTransactionManager

更多TransactionManager:

image002.jpg

代理机制

在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务。

Spring AOP 代理有 CglibAopProxy (通过继承被代理的类来代理)和 JdkDynamicAopProxy (通过实现被代理类的接口来代理)两种。

全注解的方式配置拦截器

使用全注解的方式配置拦截器,以拦截被@Transactional注解的方法。

<?xml version="1.0" encoding="UTF-8"?>  
<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-2.5.xsd  
          http://www.springframework.org/schema/context  
          http://www.springframework.org/schema/context/spring-context-2.5.xsd  
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
 
   <context:annotation-config />  
   <context:component-scan base-package="com.bluesky" />  
 
   <tx:annotation-driven transaction-manager="transactionManager"/>  
 
   <bean id="sessionFactory"    
           class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
       <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
       <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
   </bean>    
 
   <!-- 定义事务管理器(声明式的事务) -->    
   <bean id="transactionManager"  
       class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
       <property name="sessionFactory" ref="sessionFactory" />  
   </bean>  
     
</beans>  


@Transactional注解的使用

可以将@Transactional 注解添加到合适的方法上,也可以加到类上,此时该类所有的公共方法都配置了相同的事务属性信息。

Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用。PlatfromTransactionManager是spring事务管理的核心接口。


TransactionDefinition    
public interface TransactionDefinition {    
     int getPropagationBehavior();    
     int getIsolationLevel();    
     int getTimeout();    
     boolean isReadOnly();    
}
属性名说明
name当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
propagation事务的传播行为,默认值为 REQUIRED。
isolation事务的隔离度,默认值采用 DEFAULT。
timeout事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
read-only指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollback-for用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
no-rollback- for抛出 no-rollback-for 指定的异常类型,不回滚事务。

其中:

Isolation level,隔离级别

  • ISOLATION_DEFAULT ,使用数据库默认的隔离级别(默认选项)

  • ISOLATION_READ_UNCOMMITTED,未提交读

  • ISOLATION_READ_COMMITTED ,提交读

  • ISOLATION_REPEATABLE_READ,可重复读

  • ISOLATION_SERIALIZABLE,序列化

Propagation Behavior,传播性

  • REQUIRED的含义是,支持当前已经存在的事务,如果还没有事务,就创建一个新事务。(默认)

  • MANDATORY的含义是,支持当前已经存在的事务,如果还没有事务,就抛出一个异常。

  • NESTED的含义是,在当前事务中创建一个嵌套事务,如果还没有事务,那么就简单地创建一个新事务。

  • REQUIRES_NEW的含义是,挂起当前事务,创建一个新事务,如果还没有事务,就简单地创建一个新事务。

  • NOT_SUPPORTED的含义是,强制不在事务中运行,如果当前存在一个事务,则挂起该事务。

  • SUPPORTS的含义是,支持当前事务,如果没有事务那么就不在事务中运行。SUPPORTS传播性的逻辑含义比较模糊,因此一般是不推荐使用的。

参考

Spring事务管理中@Transactional的propagation参数

透彻的掌握 Spring 中@transactional 的使用



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。