配置如下:
id="txadvice"
transaction-manager="txmanager">
name="get*"
read-only="true"/>
name="query*"
read-only="true"/>
name="*"/>
tx:attributes>
tx:advice>
id="dbservice"
expression="execution(*
com.qyd.sms.service.api.student.service.studentservice.*(..))" />
advice-ref="txadvice"
pointcut-ref="dbservice" />
aop:config>
事務管理表現為無效,同時還有乙個非常奇怪的現象:如果將com.qyd.sms.service.api.student.service.studentservice這個類,以
的形式顯式的配置在配置檔案中,事務管理就可以生效
不得其解,很幸運在網上找到了這個:spring+springmvc,宣告式事務失效,原因以及解決辦法,結合目前的情況(顯式配置生效,註解不生效),以及這篇文章的內容,無效的原因應該是studentservice沒有被spring載入,而是被springmvc載入,而srpingmvc載入時沒有處理事務相關的部分,所以事務配置無效
有起色,去著重看一下專案的spring、springmvc的啟動方式,
>
org.springframework.web.context.contextloaderlistener
>
>
>contextconfiglocation>
>classpath*:/meta-inf/spring/spring-beans
.xml
>
>
>qyd-sms
-servlet
>
>org.springframework.web.servlet.dispatcherservlet>
>
>contextconfiglocation>
>classpath*:/meta-inf/spring/spring-web
.xml
>
>
-startup
>
1-startup
>
>
>qyd-sms
-servlet
>
>
/*
spring是通過contextloaderlistener啟動,springmvc通過dispatcherservlet啟動,經過驗證,spring 先於 springmvc 啟動(暫時將contextloaderlistener啟動的部分稱為spring,表示spring核心的部分,而springmvc則是處理請求的部分)
當前配置:spring啟動配置了事務管理,沒有配置自動掃瞄,springmvc配置了全域性的自動掃瞄
事務無效的原因分析:
spring啟動時能夠拿到事務管理資訊,但是由於沒有配置掃瞄配置,所以看不到通過註解註冊的studentservice,也就無法進行studentservice的事務相關的處理
等到springmvc啟動時,可以註冊studentservice,但是沒有事務管理相關的配置,也就不會做事務相關的處理(tip:我不會嘗試在springmvc中加入事務管理配置,去試一下是否事務能生效,因為即使能生效,也不會採用這種做法,理解即可)
所以 只要在spring啟動時看到註冊studentservice,就能夠進行事務相關的處理,事務就能夠生效,這也解釋了為什麼顯式配置乙個bean就可以生效,通常我們不會去顯式配置每乙個service,所以spring配置掃瞄即可解決該問題
我的解決方案:
springmvc:
spring:
expression="org.springframework.stereotype.controller"/>
context:component-scan>
配置檔案如上,原因下面有說明。
說明:
經過測試,springmvc controller的註冊是不能放在spring啟動時進行的,因為springmvc拿到註冊的controller資訊後進行了的進一步處理,用於接收來訪的請求
我更傾向於,spring,springmvc使用同乙個bean容器,springmvc完全是基於spring來處理依賴注入的關係的,只不過springmvc做了額外的事
既然二者功能不同,對於配置檔案的話,我比較傾向於根據功能完全分開,springmvc只負責了controller層的註冊的掃瞄,spring則負責其它所有。
spring事務配置無效問題解決
專案使用spring springmvc mybatis,配置完之後發現事務沒起作用,搗鼓了幾乎乙個白天。最後的解決方案是,springmvc和spring是兩個配置檔案,修改spring mvc.xml的掃瞄路徑,把service排除,順便把spring.xml的掃瞄路徑裡control排除。因為...
Spring無效的事務傳播行為
insertrole方法上的propagation propagation.requires new表示不管當前上下文環境有沒有事務,都重新開啟乙個新的事務,但實際上是不生效的。原因如下 spring的事務管理是在通過動態 類進入invoke方法裡面的,然後判斷是否需要攔截方法,需要的時候才根據註解...
配置方式配置事務
配置了事務管理器 配置了切點 dao層的對應的方法 配置了切面 事務的傳播行為,隔離級別 讀取資料庫配置檔案 db.properties context property placeholder 初始化 資料來源 datasource class com.alibaba.druid.pool.dru...