天天看點

spring事務失效情況分析

<!--[if !supportlists]-->一、<!--[endif]-->聲明式事務和注解事務并存的情況下,事務失效。

該情況常見配置如下:

<!--事務聲明-->

<bean name="transactionmanager"

    class="org.springframework.jdbc.datasource.datasourcetransactionmanager">

       <property name="datasource" ref="datasource"></property>

    </bean>

<!--聲明式事務 –->

<tx:advice id="txadvice" transaction-manager="transactionmanager">

       <tx:attributes>

           <tx:method name="insert*" propagation="required" read-only="false"

              rollback-for="java.lang.exception" />

           <tx:method name="save*" propagation="required" read-only="false"

           <tx:method name="update*" propagation="required" read-only="false"

           <tx:method name="modify*" propagation="required" read-only="false"

           <tx:method name="delete*" propagation="required" read-only="false"

           <tx:method name="find*" propagation="supports" />

           <tx:method name="get*" propagation="supports" />

           <tx:method name="select*" propagation="supports" />

       </tx:attributes>

    </tx:advice>

    <aop:config>

       <aop:pointcut id="pc"

           expression="execution(* com.suning.sop.*.service.*(..))" />

       <aop:advisor advice-ref="txadvice" pointcut-ref="pc" />

    </aop:config>

<!—注解式事務 –->

<tx:annotation-driven

proxy-target-class="true"

transaction-manager="transactionmanager"/>

解決方法:聲明優先級,order,值越大優先級越低

将上例中,<aop:config>節點修改成如下所示

       <aop:advisor advice-ref="txadvice" pointcut-ref="pc" order="1"/>

<!--[if !supportlists]-->二、<!--[endif]-->controller,service層和dao層全部使用注解生成bena,service層方法也使用注解聲明事,這種情況由于 @controller 會把 關聯的@servie自動執行個體化,而此時service層中聲明的事務并沒有被執行個體化,導緻事務失效。

解決方法:

<context:component-scan base-package="com.comtop"  use-default-filters="false" >

        <context:include-filter expression="org.springframework.stereotype.controller" type="annotation"/>    

</context:component-scan>    

<context:component-scan base-package="com.comtop">    

        <context:exclude-filter expression="org.springframework.stereotype.controller" type="annotation"/>    

</context:component-scan>   

include:把@controller關聯的@service自動執行個體化

exclude:屏蔽@service自動執行個體化

<!--[if !supportlists]-->三、<!--[endif]-->三層都使用注解,事務也使用注解聲明。事務失效

spring 會先加載聲明在xml檔案中的bean

其次是加載<context:component-scan>标簽聲明的包中,

聲明了@controller,@service,@component,@re @repository的類

最後是 @transactional 标記,但上一步處理component-scan 聲明的包時,類包含的@transactional标記沒有被處理,是以事務控制失效。

service 層的類使用xml檔案聲明bean,但是事務控制仍然使用@transactional注解來聲明,事務控制才能生效

特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~