1. 程式人生 > >ssm事務配置不起作用問題

ssm事務配置不起作用問題

在搭建ssm專案過程中遇到了,配置的事務不起作用的問題,百度了下,原因大概就是包掃描的問題:spring的配置檔案application.xml中包掃描不需要掃描@Controller註解的, 具體如下:

   <context:component-scan base-package="com.practice.controller">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>

springMVC配置檔案springMVC-servlet.xml中只需要掃描@Controller註解的,具體如下:

    <context:component-scan base-package="com.practice.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
事務配置我用的是宣告式事務配置,在application.xml中配置的,具體如下:
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 開啟事務控制的註解支援 -->  
    <tx:annotation-driven transaction-manager="transactionManager"/>

用的時候只需要在需要事務管理的類上或方法上加@Transactional就行,當然可以在@Transactional後進行更加詳細的配置,此處不是重點,就不講了。

按道理來說這樣配置後就可以了,可是當進行插入時明明有異常卻不能回滾,也就是事務根本沒有起作用,苦思之後,發現事務配置在了控制層也就是@Controller中,可是有什麼關係嗎?事務配置在Controller層中難道不可以嗎?應該沒有規定不能配置在事務中吧,繼續百度事務可不可以配置在Controller層中,答案可以,那為什麼不起效呢,見鬼了。再仔細看看配置檔案,發現了問題:在application.xml檔案中我已經排除了掃描@Controller的類,那麼再將事務加在@Controller註解的類上,事務肯定也不會被掃描,那它肯定不會有效,所以我將事務配置放到了spring MVC的配置檔案中,然後跟預想一樣,事務起效了。

所以反過來,如果不移動配置,那麼就需要將@Transactional加到service層中的類或方法上。

由此可見,我們就需要養成良好的分層習慣,因為一般的公司和專案都會分層,而如果我們沒分層或者分的混亂,那麼可能在別人那不會遇到的問題自己就會遇到,即使程式碼可能完全一樣。另外,還說明了一個問題:那就是spring容器和spring mvc容器之間是層級關係的,具體的就是spring容器是spring mvc容器的父容器,在spring中的配置可以整個專案使用,spring mvc中的配置只能在spring mvc 作用範圍內,也就是說spring mvc可以使用spring中配置的,spring不可以使用spring mvc中配置的。