exp 事務配置無效

2021-07-11 10:51:17 字數 2471 閱讀 6997

配置如下:

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...