【java-Spring】Spring的聲明式事務管理

(一)通過方法名+後綴的方式添加事務 配置Spring.xml

    <!-- 定義事務 -->
    <bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 定義Spring掃描的類範圍,掃描ServiceImpl包下的所有類 -->
    <aop:config>
        <aop:pointcut id="appTxOperation" expression="execution(* com.qihoo.finance..*ServiceImpl.*(..)) and !execution(* com.qihoo.finance..CpQueryHistoryService.*(..))"/>
        <aop:advisor pointcut-ref="appTxOperation" advice-ref="appTxAdvice"/>
    </aop:config>
    <!-- 定義事務的屬性 -->
    <tx:advice id="appTxAdvice" transaction-manager="appTransactionManager">
        <tx:attributes>
            <tx:method name="*Trx" propagation="REQUIRED"/>
            <tx:method name="*NewTrx" propagation="REQUIRES_NEW"/>
            <tx:method name="*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
後綴是用切面的方式實現的,方法名*Trx表明爲REQUIRED事務,方法名*NewTrx表明爲REQUIRED_NEW事務。


(二)通過註解的方式添加事務 配置Spring.xml

    <!-- 定義事務 -->
    <bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置 Annotation 驅動,掃描@Transactional註解的類定義事務  -->
    <tx:annotation-driven transaction-manager="appTransactionManager" proxy-target-class="true"/>

註釋添加方式:

@Transactional(propagation = Propagation.REQUIRES_NEW)


(三)事務傳播行爲

事務的第一個方面是傳播行爲(propagation behavior)。當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在自己的事務中運行。Spring定義了七種傳播行爲:

傳播行爲含義
PROPAGATION_REQUIRED表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啓動一個新的事務
PROPAGATION_SUPPORTS表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中運行
PROPAGATION_MANDATORY表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常
PROPAGATION_REQUIRED_NEW表示當前方法必須運行在它自己的事務中。一個新的事務將被啓動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
PROPAGATION_NOT_SUPPORTED表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
PROPAGATION_NEVER表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常
PROPAGATION_NESTED表示如果當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行爲與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行爲的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章