@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
</context:component-scan>
在spring.xml中掃描@service:
<!-- 掃描dao和service,因為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是通過動態代理實現的),