Spring事务控制

来源:互联网 发布:好用的护手霜推荐 知乎 编辑:程序博客网 时间:2024/05/01 11:32

       JavaEE应用中的传统事务有两种策略:全局事务和局部事务,全局事务由应用服务器管理,需要底层服务JTA(java transaction API 支持分布式事务)支持。局部事务和底层所采用的持久化技术有关(JDBC,Hibernate……)。

 

        在spring中,spring采用观察者模式,通过PlatformTransactionManager接口体现,随着底层不同的事务策略来切换,应用不同的实现类。

 

        理论性的东西就不多说了,大家自己看吧,我也懂得不多,现在就写下spring中怎么配置JDBC,hibernate事务(JTA没有用过,在这里就不班门弄斧了)

        

        <!-- 连接池proxool配置,先配置数据源 --><bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">        <property name="driver" value="com.mysql.jdbc.Driver"></property>        <property name="driverUrl"                                                                               value="jdbc:mysql://127.0.0.1:3306/home?characterEncoding=UTF-8">                      </property>        <property name="user" value="****"></property>        <property name="password" value="***"></property>        <property name="alias" value="home_pool" />    <property name="prototypeCount" value="2" />     <property name="maximumConnectionCount" value="24" />     <property name="minimumConnectionCount" value="8" />     <property name="simultaneousBuildThrottle" value="24" />     <property name="maximumActiveTime" value="300000" />    <property name="houseKeepingSleepTime" value="99000" />    <property name="houseKeepingTestSql" value="select 1 from dual" />      </bean>


        JDBC局部事务管理器

       

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


 

        Hibernate需要配置sessionfactory

<!-- sessionFactory配置 --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource">        <ref bean="DataSource" />        </property>        <property name="hibernateProperties">            <props>                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>                <prop key="hibernate.show_sql">true</prop>                                <!-- 指定Hibernate持久化操作的批操作大小 -->                <prop key="hibernate.jdbc.batch_size">30</prop>                <prop key="hibernate.jdbc.fetch_size">50</prop>                <prop key="hibernate.max_fetch_depth">1</prop>                <prop key="hibernate.default_batch_fetch_size">10</prop>                <prop key="hibernate.connection.release_mode">auto</prop>                <prop key="hibernate.transaction.flush_before_completion">true</prop>            </props>        </property>                <property name="mappingDirectoryLocations">     <list>     <value>classpath:/cn/life/entity</value>     </list>     </property></bean>

  这里面的具体参数配置就不讲了,我们专门看事务配置

   

           HIbernate局部事务管理器

    <bean id="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory" />    </bean>


 ======================================================================================
       事务管理器配置好后,接下来就要为业务逻辑Bean配置事务代理了

   <bean id="newsDaoTrans"         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">        <property name="transactionManager" ref="transactionManager"/><property name="target" ref="目标beanID" /><property name="transactionAttributes"><props><prop key="*">PROPAGATION_REQUIRED</prop></props></property>    </bean>


      AOP配置方式如下,用AOP记得引入AOP schema:

   <tx:advice id="txAdvice" transaction-manager="transactionManager">        <tx:attributes>            <tx:method name="find*" propagation="REQUIRED" read-only="true" />            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>            <tx:method name="query*" propagation="REQUIRED" read-only="true"/>            <tx:method name="search*" propagation="REQUIRED" read-only="true"/>            <tx:method name="pagedQuery*" propagation="REQUIRED" read-only="true"/>            <tx:method name="display*" propagation="REQUIRED" read-only="true"/>            <tx:method name="save*" propagation="REQUIRED" />            <tx:method name="delete*" propagation="REQUIRED" />            <tx:method name="update*" propagation="REQUIRED" />            <tx:method name="add*" propagation="REQUIRED" />            <tx:method name="*" propagation="REQUIRED" />        </tx:attributes>    </tx:advice>        <aop:config><!--给cn.life.*.service.*包下的所有方法加事务 -->        <aop:pointcut id="interceptorPointCuts"            expression="execution(* cn.life.*.service.*.*(..))" />        <aop:advisor advice-ref="txAdvice"             pointcut-ref="interceptorPointCuts" />            </aop:config> 

以上就把事务配置好了,两种配置方式我想,通过代码应该明白他们的优缺点了吧,TransactionProxyFactoryBean配置策略虽然易懂,但是配置反锁,每个目标bean都要配置,这会导致配置文件繁琐,tx命名空间配置事务管理就更加的简洁。当然tx还有更负责的配置及注解式事务配置,在这里就不深究了。

       

原创粉丝点击