面试题整理--开发中实现spring的事务有5种方式

Spring+Hibernate的实质:
就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理。

那么再没整合之前Hibernate是如何实现事务管理的呢?
通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。

一.事务的4个特性:
原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。
一致性:数据不会因为事务的执行而遭到破坏。
隔离性:一个事务的执行,不受其他事务(进程)的干扰。既并发执行的个事务之间互不干扰。
持久性:一个事务一旦提交,它对数据库的改变将是永久的。

二.事务的实现方式:
实现方式共有两种:编码方式;声明式事务管理方式。

基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。

声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

三.创建事务的时机:

是否需要创建事务,是由事务传播行为控制的。读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。

Spring 配置文件中关于事务配置总是由三个组成部分,分别是 DataSource TransactionManager 和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

    DataSourceTransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactoryTransactionManager的实现为HibernateTransactionManager

    具体如下图:



 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

    第一种方式:每个Bean都有一个代理

  1.     <bean id="sessionFactory"    
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  5.     </bean>    
  6.   
  7.     <!-- 定义事务管理器(声明式的事务) -->    
  8.     <bean id="transactionManager"  
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  10.         <property name="sessionFactory" ref="sessionFactory" />  
  11.     </bean>  
  12.       
  13.     <!-- 配置DAO -->  
  14.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
  15.         <property name="sessionFactory" ref="sessionFactory" />  
  16.     </bean>  
  17.       
  18.     <bean id="userDao"    
  19.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
  20.            <!-- 配置事务管理器 -->    
  21.            <property name="transactionManager" ref="transactionManager" />       
  22.         <property name="target" ref="userDaoTarget" />    
  23.          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />  
  24.         <!-- 配置事务属性 -->    
  25.         <property name="transactionAttributes">    
  26.             <props>    
  27.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
  28.             </props>    
  29.         </property>    
  30.     </bean>    
  31. </beans>  

第二种方式:所有Bean共享一个代理基类

  1.     <bean id="sessionFactory"    
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  5.     </bean>    
  6.   
  7.     <!-- 定义事务管理器(声明式的事务) -->    
  8.     <bean id="transactionManager"  
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  10.         <property name="sessionFactory" ref="sessionFactory" />  
  11.     </bean>  
  12.       
  13.     <bean id="transactionBase"    
  14.             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    
  15.             lazy-init="true" abstract="true">    
  16.         <!-- 配置事务管理器 -->    
  17.         <property name="transactionManager" ref="transactionManager" />    
  18.         <!-- 配置事务属性 -->    
  19.         <property name="transactionAttributes">    
  20.             <props>    
  21.                 <prop key="*">PROPAGATION_REQUIRED</prop>    
  22.             </props>    
  23.         </property>    
  24.     </bean>      
  25.      
  26.     <!-- 配置DAO -->  
  27.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
  28.         <property name="sessionFactory" ref="sessionFactory" />  
  29.     </bean>  
  30.       
  31.     <bean id="userDao" parent="transactionBase" >    
  32.         <property name="target" ref="userDaoTarget" />     
  33.     </bean>  
  34. </beans>  

第三种方式:使用拦截器

  1.     <bean id="sessionFactory"    
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  5.     </bean>    
  6.   
  7.     <!-- 定义事务管理器(声明式的事务) -->    
  8.     <bean id="transactionManager"  
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  10.         <property name="sessionFactory" ref="sessionFactory" />  
  11.     </bean>   
  12.      
  13.     <bean id="transactionInterceptor"    
  14.         class="org.springframework.transaction.interceptor.TransactionInterceptor">    
  15.         <property name="transactionManager" ref="transactionManager" />    
  16.         <!-- 配置事务属性 -->    
  17.         <property name="transactionAttributes">    
  18.             <props>    
  19.                 <prop key="*">PROPAGATION_REQUIRED</prop>    
  20.             </props>    
  21.         </property>    
  22.     </bean>  
  23.         
  24.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
  25.         <property name="beanNames">    
  26.             <list>    
  27.                 <value>*Dao</value>  
  28.             </list>    
  29.         </property>    
  30.         <property name="interceptorNames">    
  31.             <list>    
  32.                 <value>transactionInterceptor</value>    
  33.             </list>    
  34.         </property>    
  35.     </bean>    
  36.     
  37.     <!-- 配置DAO -->  
  38.     <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">  
  39.         <property name="sessionFactory" ref="sessionFactory" />  
  40.     </bean>  
  41. </beans>  


第四种方式:使用tx标签配置的拦截器

  1.     <bean id="sessionFactory"    
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  5.     </bean>    
  6.   
  7.     <!-- 定义事务管理器(声明式的事务) -->    
  8.     <bean id="transactionManager"  
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  10.         <property name="sessionFactory" ref="sessionFactory" />  
  11.     </bean>  
  12.   
  13.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  14.         <tx:attributes>  
  15.             <tx:method name="*" propagation="REQUIRED" />  
  16.         </tx:attributes>  
  17.     </tx:advice>  
  18.       
  19.     <aop:config>  
  20.         <aop:pointcut id="interceptorPointCuts"  
  21.             expression="execution(* com.bluesky.spring.dao.*.*(..))" />  
  22.         <aop:advisor advice-ref="txAdvice"  
  23.             pointcut-ref="interceptorPointCuts" />          
  24.     </aop:config>        
  25. </beans> 

第五种方式:全注

  1.   
  2.     <tx:annotation-driven transaction-manager="transactionManager"/>  
  3.   
  4.     <bean id="sessionFactory"    
  5.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  6.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
  7.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  8.     </bean>    
  9.   
  10.     <!-- 定义事务管理器(声明式的事务) -->    
  11.     <bean id="transactionManager"  
  12.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  13.         <property name="sessionFactory" ref="sessionFactory" />  
  14.     </bean>  
  15.       
  16. </beans> 

此时在Service类上需加上@Transactional注解

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值