} } }

    Spring根蒂根基系列——事务Transaction

    添加时间:2013-6-11 点击量:

    在spring的事务经管高层抽象层中首要包含3个借口:TransactionDefinition,PlatformTransactionManager,TransactionStatus


    TransactionDefinition用于描述隔离级别、超不时候、是否为只读事务和事务传播规矩


    TransactionStatus代表一个事务的具体运行状况、以及保存点


    PlatformTransactionManager一个高层次的接口,包含3个办法commit、rollback和getTramsaction


    事务传播级别:



    PROPAGATION_REQUIRED--支撑当前事务,若是当前没有事务,就新建一个事务。这是最常见的选择。实用于save、、等操纵
    
    PROPAGATION_SUPPORTS--支撑当前事务,若是当前没有事务,就以非事务体式格式履行。一般读db的操纵可是应用此体式格式,同时将事物设置为ReadOnly。
    PROPAGATION_MANDATORY--支撑当前事务,若是当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW--新建事务,若是当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED--以非事务体式格式履行操纵,若是当前存在事务,就把当前事务挂起。实用于优先级别很高的办法。
    PROPAGATION_NEVER--以非事务体式格式履行,若是当前存在事务,则抛出异常。
    PROPAGATION_NESTED--若是当前存在事务,则在嵌套事务内履行。若是当前没有事务,则进行与PROPAGATION_REQUIRED类似的操纵。


    三种事务经管体式格式:编程式事务经管、应用xml设备声明式事务、应用注解设备声明式事务


    1.编程式事务经管



    2.应用xml设备声明式事务


    事务属性信息设备规矩



    <!-- 传播行动,隔离级别(可选),是否为只读(可选),产生这些异常时回滚(可选),产生这些异常时照样提交(可选)-->
    
    <prop>PROPAGATION,ISOLATION,readOnly,_Exception,+Exception</prop>



    第一种:也是我们最常用的办法了,它实用于你的库表斗劲少的景象下。



    <bean id=fundServiceDAOProxy
    
    class
    =org.springframework.transaction.interceptor.TransactionProxyFactoryBean>
    <!-- 设备事务经管器 -->
    <property name=transactionManager>
    <ref bean=transactionManager />
    </property>
    <!-- 此属性指定目标类本省是否是的对象,若是目标类没有实现任何类,就设为true代表本身 -->
    <property name=proxyTargetClass>
    <value>false</value>
    </property>
    <!-- 目标实现的接口 -->
    <property name=proxyInterfaces>
    <value>com.jack.fund.service.IFundService</value>
    </property>
    <!-- 目标bean -->
    <property name=target>
    <ref bean=fundService />
    </property>
    <!-- 设备事务属性 -->
    <property name=transactionAttributes>
    <props>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=add>PROPAGATION_REQUIRED</prop>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=save>PROPAGATION_REQUIRED</prop>
    <prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>


    以下可能还有其他的xxxServiceDAOProxy.大师可以看出针对每一个功能模块设备一个营业办事。若是模块多鬼话,就显得代码有点多了,发明他们只是稍微一点不一样。这时我们就应当想到持续的思惟。用第二种办法。


    第二种:设备声明式事务的办法如下。这种景象合适相对斗劲多的模块时应用。



    <!-- 哄骗持续的思惟简化设备,要把abstract=true -->
    
    <bean id=transactionBase
    class
    =org.springframework.transaction.interceptor.TransactionProxyFactoryBean
    lazy-init
    =true abstract=true>
    <!-- 设备事务经管器 -->
    <property name=transactionManager>
    <ref bean=transactionManager />
    </property>
    <!-- 设备事务属性 -->
    <property name=transactionAttributes>
    <props>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=add>PROPAGATION_REQUIRED</prop>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=save>PROPAGATION_REQUIRED</prop>
    <prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>


    而具体的模块可以简单的如许设备。只要指明它的parent(父类)就可以了。父类一般把abstract=true,因为在容器加载的时辰不须要初始化,比及用的时辰再有它的子类调用的时辰,再去初始化。



    <bean id=fundServiceDAOProxy parent=transactionBase >
    
    <property name=target>
    <ref bean=fundService />
    </property>
    </bean>


    如许设备的话,若是有多个像fundService如许模块时,可以少些很多反复的代码。


    第三种:设备声明式事务的办法如下。首要哄骗BeanNameAutoProxyCreator主动创建事务




    <bean id=transactionInterceptor
    
    class
    =org.springframework.transaction.interceptor.TransactionInterceptor>
    <property name=transactionManager>
    <ref bean=transactionManager />
    </property>
    <!-- 设备事务属性 -->
    <property name=transactionAttributes>
    <props>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=add>PROPAGATION_REQUIRED</prop>
    <prop key=>PROPAGATION_REQUIRED</prop>
    <prop key=save>PROPAGATION_REQUIRED</prop>
    <prop key=find>PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>
    <bean
    class=org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator>
    <property name=beanNames>
    <list>
    <value>fundService</value>
    </list>
    </property>
    <property name=interceptorNames>
    <list>
    <value>transactionInterceptor</value>
    </list>
    </property>
    </bean>


    这种办法首要哄骗了阻碍器的道理。
    前三种办法一般都必须指定具体的模块bean.若是模块过多话,比如一个大型的网站一般有几十个模块。我们就得推敲用第四种的设备体式格式了。主动创建事务的体式格式了。


    第四种:设备声明式事务的办法如下。



    <bean id=transactionInterceptor
    
    class
    =org.springframework.transaction.interceptor.TransactionInterceptor>
    <property name=transactionManager>
    <ref bean=transactionManager />
    </property>
    <!-- 主动 -->
    <bean id=autoproxy
    class
    =org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator>
    <!-- 可所以Service或DAO层(好是针对营业层Service) -->
    <property name=beanNames>
    <list>
    <value>Service</value>
    </list>
    </property>
    <property name=interceptorNames>
    <list>
    <value>transactionInterceptor</value>
    </list>
    </property>
    </bean>


    主动还有一种用法就是连络正规表达式和advice应用。



    <bean id=transactionInterceptor
    
    class
    =org.springframework.transaction.interceptor.TransactionInterceptor>
    <property name=transactionManager>
    <ref bean=transactionManager />
    </property>
    <bean id=autoProxyCreator
    class
    =org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator />
    <bean id=regexpMethodPointcutAdvisor
    class
    =org.springframework.aop.support.RegexpMethodPointcutAdvisor>
    <property name=advice>
    <ref bean=transactionInterceptor />
    </property>
    <property name=pattern>
    <value>.</value>
    </property>
    </bean>


    这个办法可以针对具体的模块进行阻碍并进行事务处理惩罚。
    在你的实际项目中,你可以按照你的景象选用不合的办法。


    具体:http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html


    3.应用注解设备声明式事务 @Transaction


    注解本身具有一些广泛应用的默认属性,所以往往只加一个@Transaction就可以了


    @Transaction注解属性申明


    value:可以绑定到不合的事务经管器上


    propagation:事务传播行动


    isolation:事务隔离级别


    readOnly:是否为只读


    timeout:超不时候


    rollbackFor:一组异常类,碰到时进行回滚,类型为Class<? extemds Tjrpwab;e>[],默认为{}


    rollbackForClassName:一组异常类,碰到时进行回滚,类型为String[],默认为{}


    noRollbackFor:一组异常类,碰到时不回滚,类型为Class<? extemds Tjrpwab;e>[],默认为{}


    noRollbackForClassName:一组异常类,碰到时不回滚,类型为String[],默认为{}




    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: