1. 程式人生 > >@Transaction作用在Controller層或者是service層的配置,解決事務的作用域

@Transaction作用在Controller層或者是service層的配置,解決事務的作用域

一,如果在service層加事務

1.事務一般要放在Service層,放在Controller也可以,。

2.在springmvc的配置檔案中掃描controller時要忽略service,因為在springmvc的配置檔案載入的service事務不起作用。所以在springmvc.xml中:

<!-- 掃描web相關的bean 只掃描@controller,忽略service ,因為springmvc掃描的service沒有事務-->

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

<context:exclude-filter

type="annotation" expression="org.springframework.stereotype.Service" />

</context:component-scan>

spring.xml中掃描@service

<!-- 掃描daoservice,因為spring掃描的service才具有事務功能 -->

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

</context:component-scan>

 3.在service層中的類方法加@Transaction註解即可

    前提是:在spring.xml配置了:

    <!-- 事務配置 -->

     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

    </bean>

 <!-- 使用annotation註解方式配置事務 -->

    <tx:annotation-driven transaction-manager="transactionManager" />

二,在Controller層加事務:

將事物加在contrller層,只需要在springmvc.xml中加上<tx:annotation-driven/>即可,也要在掃描包同service一樣(上面)並且contrller類中加上@Transactional即可。

前提是在spring.xml中要有事物管理器的配置即

 <!-- 事務配置 -->

     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

    </bean>

注意: Controller層只支援 @Transactional 註解式事務!

注意:@Transaction不起作用的:1.靜態(static )方法,  2,(private)私有化方法,   3,自呼叫方法(因為事務是依賴aop的,而aop是通過動態代理實現的),