zoukankan      html  css  js  c++  java
  • Spring 配置 事务的几种方式

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

     

    首先我创建了两个类,一个接口一个实现:

    Java代码  收藏代码
    1. package com.dao;  
    2. public interface UserDao {  
    3.     public void getUser();    
    4. }  

    实现:

    Java代码  收藏代码
    1. package com.dao.impl;  
    2. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
    3. import com.dao.UserDao;  
    4. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {  
    5.     public void getUser(){        
    6.     }     
    7. }  

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

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:aop="http://www.springframework.org/schema/aop"  
    5.     xmlns:tx="http://www.springframework.org/schema/tx"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
    7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
    8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    9.     <!-- 数据源 -->  
    10.     <bean id="dataSource"  
    11.         class="org.apache.commons.dbcp.BasicDataSource"  
    12.         destroy-method="close">  
    13.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    14.         <property name="url"  
    15.             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    16.         <property name="username" value="root" />  
    17.         <property name="password" value="root" />  
    18.         <!-- 连接池启动时的初始值 -->  
    19.         <property name="initialSize" value="10" />  
    20.         <!-- 连接池的最大值 -->  
    21.         <property name="maxActive" value="10" />  
    22.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    23.         <property name="maxIdle" value="20" />  
    24.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    25.         <property name="minIdle" value="10" />  
    26.         <property name="defaultAutoCommit" value="true" />  
    27.     </bean>  
    28.     <!-- 会话工厂 -->  
    29.     <bean id="sessionFactory"  
    30.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    31.         <property name="dataSource" ref="dataSource" />  
    32.         <property name="mappingLocations">  
    33.             <list>  
    34.                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    35.             </list>  
    36.         </property>  
    37.         <property name="hibernateProperties">  
    38.             <props>  
    39.                 <prop key="hibernate.dialect">  
    40.                     org.hibernate.dialect.MySQL5Dialect  
    41.                 </prop>  
    42.                 <prop key="hibernate.show_sql">true</prop>  
    43.                 <prop key="hibernate.format_sql">true</prop>  
    44.             </props>  
    45.         </property>  
    46.     </bean>      
    47.     <!-- 定义事务管理器 -->    
    48.     <bean id="transactionManager"  
    49.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    50.         <property name="sessionFactory" ref="sessionFactory" />  
    51.     </bean>      
    52.     <!-- 配置服务层 -->  
    53.     <bean id="userDaoAgency" class="com.dao.impl.UserDaoImpl">  
    54.         <property name="sessionFactory" ref="sessionFactory" />  
    55.     </bean>      
    56.     <bean id="userDao"    
    57.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
    58.         <!-- 配置事务管理器 -->    
    59.         <property name="transactionManager" ref="transactionManager" />       
    60.         <property name="target" ref="userDaoAgency" />    
    61.         <property name="proxyInterfaces" value="com.dao.UserDao" />  
    62.         <!-- 配置事务属性 -->    
    63.         <property name="transactionAttributes">    
    64.             <props>    
    65.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
    66.             </props>    
    67.         </property>    
    68.     </bean>  
    69. </beans>  

    第二种:所有Bean共享一个代理:

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:aop="http://www.springframework.org/schema/aop"  
    5.     xmlns:tx="http://www.springframework.org/schema/tx"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
    7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
    8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    9.     <!-- 数据源 -->  
    10.     <bean id="dataSource"  
    11.         class="org.apache.commons.dbcp.BasicDataSource"  
    12.         destroy-method="close">  
    13.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    14.         <property name="url"  
    15.             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    16.         <property name="username" value="root" />  
    17.         <property name="password" value="root" />  
    18.         <!-- 连接池启动时的初始值 -->  
    19.         <property name="initialSize" value="10" />  
    20.         <!-- 连接池的最大值 -->  
    21.         <property name="maxActive" value="10" />  
    22.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    23.         <property name="maxIdle" value="20" />  
    24.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    25.         <property name="minIdle" value="10" />  
    26.         <property name="defaultAutoCommit" value="true" />  
    27.     </bean>  
    28.     <!-- 会话工厂 -->  
    29.     <bean id="sessionFactory"  
    30.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    31.         <property name="dataSource" ref="dataSource" />  
    32.         <property name="mappingLocations">  
    33.             <list>  
    34.                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    35.             </list>  
    36.         </property>  
    37.         <property name="hibernateProperties">  
    38.             <props>  
    39.                 <prop key="hibernate.dialect">  
    40.                     org.hibernate.dialect.MySQL5Dialect  
    41.                 </prop>  
    42.                 <prop key="hibernate.show_sql">true</prop>  
    43.                 <prop key="hibernate.format_sql">true</prop>  
    44.             </props>  
    45.         </property>  
    46.     </bean>  
    47.     <!-- 定义事务管理器 -->  
    48.     <bean id="transactionManager"  
    49.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    50.         <property name="sessionFactory" ref="sessionFactory" />  
    51.     </bean>  
    52.      <!-- 定义事务 -->  
    53.     <bean id="base"  
    54.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
    55.         lazy-init="true" abstract="true">  
    56.         <!-- 配置事务管理器 -->  
    57.         <property name="transactionManager" ref="transactionManager" />  
    58.         <!-- 配置事务属性 -->  
    59.         <property name="transactionAttributes">  
    60.             <props>  
    61.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
    62.             </props>  
    63.         </property>  
    64.     </bean>  
    65.     <!-- 配置服务层 -->  
    66.     <bean id="userDao"  
    67.         class="com.dao.impl.UserDaoImpl">  
    68.         <property name="sessionFactory" ref="sessionFactory" />  
    69.     </bean>  
    70.     <!-- 代理对象 -->  
    71.     <bean id="userDaoAgency" parent="base">  
    72.         <property name="target" ref="userDao" />  
    73.     </bean>  
    74. </beans>  

    第三种:拦截器:

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:aop="http://www.springframework.org/schema/aop"  
    5.     xmlns:tx="http://www.springframework.org/schema/tx"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
    7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
    8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    9.     <!-- 数据源 -->  
    10.     <bean id="dataSource"  
    11.         class="org.apache.commons.dbcp.BasicDataSource"  
    12.         destroy-method="close">  
    13.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    14.         <property name="url"  
    15.             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    16.         <property name="username" value="root" />  
    17.         <property name="password" value="root" />  
    18.         <!-- 连接池启动时的初始值 -->  
    19.         <property name="initialSize" value="10" />  
    20.         <!-- 连接池的最大值 -->  
    21.         <property name="maxActive" value="10" />  
    22.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    23.         <property name="maxIdle" value="20" />  
    24.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    25.         <property name="minIdle" value="10" />  
    26.         <property name="defaultAutoCommit" value="true" />  
    27.     </bean>  
    28.     <!-- 会话工厂 -->  
    29.     <bean id="sessionFactory"  
    30.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    31.         <property name="dataSource" ref="dataSource" />  
    32.         <property name="mappingLocations">  
    33.             <list>  
    34.                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    35.             </list>  
    36.         </property>  
    37.         <property name="hibernateProperties">  
    38.             <props>  
    39.                 <prop key="hibernate.dialect">  
    40.                     org.hibernate.dialect.MySQL5Dialect  
    41.                 </prop>  
    42.                 <prop key="hibernate.show_sql">true</prop>  
    43.                 <prop key="hibernate.format_sql">true</prop>  
    44.             </props>  
    45.         </property>  
    46.     </bean>      
    47.      <!-- 定义事务管理器(声明式的事务) -->    
    48.     <bean id="transactionManager"  
    49.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    50.         <property name="sessionFactory" ref="sessionFactory" />  
    51.     </bean>     
    52.      <!-- 定义事务 -->   
    53.     <bean id="transactionInterceptor"    
    54.         class="org.springframework.transaction.interceptor.TransactionInterceptor">    
    55.         <property name="transactionManager" ref="transactionManager" />    
    56.         <!-- 配置事务属性 -->    
    57.         <property name="transactionAttributes">    
    58.             <props>    
    59.                 <prop key="*">PROPAGATION_REQUIRED</prop>    
    60.             </props>    
    61.         </property>    
    62.     </bean>        
    63.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
    64.         <property name="beanNames">    
    65.             <list>    
    66.                 <value>*DaoImpl</value>  
    67.             </list>    
    68.         </property>    
    69.         <property name="interceptorNames">    
    70.             <list>    
    71.                 <value>transactionInterceptor</value>    
    72.             </list>    
    73.         </property>    
    74.     </bean>    
    75.     <!-- 配置服务层 -->  
    76.     <bean id="userDaoAgency" class="com.dao.impl.UserDaoImpl">  
    77.         <property name="sessionFactory" ref="sessionFactory" />  
    78.     </bean>  
    79. </beans>  

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

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:tx="http://www.springframework.org/schema/tx"  
    7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    9.            http://www.springframework.org/schema/context  
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13.     <!-- 数据源 -->  
    14.     <bean id="dataSource"  
    15.         class="org.apache.commons.dbcp.BasicDataSource"  
    16.         destroy-method="close">  
    17.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    18.         <property name="url"  
    19.             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    20.         <property name="username" value="root" />  
    21.         <property name="password" value="root" />  
    22.         <!-- 连接池启动时的初始值 -->  
    23.         <property name="initialSize" value="10" />  
    24.         <!-- 连接池的最大值 -->  
    25.         <property name="maxActive" value="10" />  
    26.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    27.         <property name="maxIdle" value="20" />  
    28.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    29.         <property name="minIdle" value="10" />  
    30.         <property name="defaultAutoCommit" value="true" />  
    31.     </bean>  
    32.     <!-- 会话工厂 -->  
    33.     <bean id="sessionFactory"  
    34.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    35.         <property name="dataSource" ref="dataSource" />  
    36.         <property name="mappingLocations">  
    37.             <list>  
    38.                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    39.             </list>  
    40.         </property>  
    41.         <property name="hibernateProperties">  
    42.             <props>  
    43.                 <prop key="hibernate.dialect">  
    44.                     org.hibernate.dialect.MySQL5Dialect  
    45.                 </prop>  
    46.                 <prop key="hibernate.show_sql">true</prop>  
    47.                 <prop key="hibernate.format_sql">true</prop>  
    48.             </props>  
    49.         </property>  
    50.     </bean>  
    51.     <context:annotation-config />  
    52.     <context:component-scan base-package="com.dao" />  
    53.     <!-- 定义事务管理器 -->    
    54.     <bean id="transactionManager"  
    55.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    56.         <property name="sessionFactory" ref="sessionFactory" />  
    57.     </bean>  
    58.     <!-- 定义事务 -->  
    59.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
    60.         <tx:attributes>  
    61.             <tx:method name="*" propagation="REQUIRED" />  
    62.         </tx:attributes>  
    63.     </tx:advice>  
    64.     <!-- 定义切面 -->  
    65.     <aop:config>  
    66.         <aop:pointcut id="interceptorPointCuts" expression="execution(* com.dao.*.*(..))" />  
    67.         <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />  
    68.     </aop:config>  
    69. </beans>  

    第五种:注解:

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:tx="http://www.springframework.org/schema/tx"  
    7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    9.            http://www.springframework.org/schema/context  
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13.     <!-- 数据源 -->  
    14.     <bean id="dataSource"  
    15.         class="org.apache.commons.dbcp.BasicDataSource"  
    16.         destroy-method="close">  
    17.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    18.         <property name="url"  
    19.             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    20.         <property name="username" value="root" />  
    21.         <property name="password" value="root" />  
    22.         <!-- 连接池启动时的初始值 -->  
    23.         <property name="initialSize" value="10" />  
    24.         <!-- 连接池的最大值 -->  
    25.         <property name="maxActive" value="10" />  
    26.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    27.         <property name="maxIdle" value="20" />  
    28.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    29.         <property name="minIdle" value="10" />  
    30.         <property name="defaultAutoCommit" value="true" />  
    31.     </bean>  
    32.     <!-- 会话工厂 -->  
    33.     <bean id="sessionFactory"  
    34.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    35.         <property name="dataSource" ref="dataSource" />  
    36.         <property name="mappingLocations">  
    37.             <list>  
    38.                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    39.             </list>  
    40.         </property>  
    41.         <property name="hibernateProperties">  
    42.             <props>  
    43.                 <prop key="hibernate.dialect">  
    44.                     org.hibernate.dialect.MySQL5Dialect  
    45.                 </prop>  
    46.                 <prop key="hibernate.show_sql">true</prop>  
    47.                 <prop key="hibernate.format_sql">true</prop>  
    48.             </props>  
    49.         </property>  
    50.     </bean>  
    51.     <context:annotation-config />  
    52.     <!-- 使用注解的包路径 -->  
    53.     <context:component-scan base-package="com.dao" />  
    54.     <!-- 支持  @Transactional 标记 -->  
    55.     <tx:annotation-driven transaction-manager="transactionManager"/>  
    56.     <!-- 定义事务管理器 -->    
    57.     <bean id="transactionManager"  
    58.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    59.         <property name="sessionFactory" ref="sessionFactory" />  
    60.     </bean>  
    61. </beans>  

    如果使用了注解,那么实现类应该这样写:

    Java代码  收藏代码
    1. package com.dao.impl;  
    2. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
    3. import org.springframework.stereotype.Component;  
    4. import org.springframework.transaction.annotation.Transactional;  
    5. import com.dao.UserDao;  
    6. @Transactional  
    7. @Component("userDaoAgency")  
    8. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {  
    9.     /** 
    10.      * 为方法增加事务处理特性 
    11.      */  
    12.     @Transactional(readOnly=true)  
    13.     public void getUser(){        
    14.     }     
    15. }  

    这样每个方法都能自己定义自己的事务处理!

  • 相关阅读:
    如何将SQLServer2005中的数据同步到Oracle中【转】
    八大排序算法总结[转]
    Web报表相关汇集(个人收藏)
    分析:城域网技术PBT交锋TMPLS
    Ubuntu下通过SSH远程登录服务器的方法
    关于VC代码的编写和调试(三)
    Start Starts a separate window to run a specified program or command.
    罗技劲雕鼠标移动速度过慢问题
    Microsoft XML Core Services 4.0 SP2 KB936181老是提示安装(转,不过我也遇到这个问题了)
    四川人逆境中的幽默
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/5759903.html
Copyright © 2011-2022 走看看