1. 程式人生 > >【問題解決】[email protected]註解事務無

【問題解決】[email protected]註解事務無

Spring SpringMVC MyBatis框架中[email protected]註解事務無效解決方法

SpringMVC-Spring-MyBatis框架
資料庫:SQL SERVER 2008
以前都是用的MySQL資料庫,沒有出現這個問題,現在換成sql server了,結果事務沒有起作用了。

經過一番測試:
排除以下幾個問題:
1.資料庫原因,不存在的。MySQL中只有InnoDB引擎支援事務。SqlServer2008的企業版作為收費資料庫,不可能不支援事務操作。
2.異常型別不是unchecked異常,我寫的異常是1/0,為了保險起見,我還丟擲RuntimeException試了,結果也是沒有回滾。
3.是不是配置檔案的沒配置好,比如Bean,比如:

    <!-- 配置事物管理類 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dynamicDataSource" />
    </bean>
    <!-- 開啟註解式事物掃描 -->
    <tx:annotation-driven transaction-manager
="transactionManager" />

檢查幾遍,排除這個原因。
4.還有一種情況,因為我以前寫的都是對一個數據庫的操作,現在是一個數據源多個數據庫操作,當時有點懷疑我是不是少配置了什麼,導致多資料庫時無法啟動事務,於是便還原到一個數據庫,結果事務還是無效,排除此問題

經過一番折騰,在網上找到一篇文章,說原因是applicationContext.xml的父容器先於Servlet的子容器生效,將Service提前載入了。

於是驗證了一下,首先去掉Service實現類的@Service註解,在spring.xml(也就是applicationContext.xml,我起名是spring.xml),配置該類的Bean:

<bean id="sysUserServiceImp" class="cn.kx59.user.service.imp.SysUserServiceImp"></bean>

結果執行之後,事務起作用了。

原因如下:
Spring容器優先載入由ServletContextListener(對應applicationContext.xml,我這裡是spring.xml)產生的父容器,而SpringMVC(對應spring-mvc.xml)產生的是子容器。
子容器Controller進行掃描裝配時裝配的@Service註解的例項是沒有經過事務加強處理,即沒有事務處理能力的Service,而父容器進行初始化的Service是保證事務的增強處理能力的。如果不在子容器中將Service exclude掉,此時得到的將是原樣的無事務處理能力的Service。
所以我們要在掃描的時候在子容器中將Service exclude掉就好了。

也就是在spring-mvc.xml中進行如下修改:

    <!--掃描Controller-->
    <context:component-scan base-package="cn.kx59">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller" />
        <!--下面這個是防止事務沒起作用,spring.xml的父容器先於Servlet的子容器生效,將Service提前載入了。這裡不用再進行載入裝配-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>

注意: 請將@Transactional註解寫在實現類的方法或類上!不建議寫在介面類中!
Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何介面上。你當然可以在介面上使用 @Transactional 註解,但是這將只能當你設定了基於介面的代理時它才生效。因為註解是不能繼承的,這就意味著如果你正在使用基於類的代理時,那麼事務的設定將不能被基於類的代理所識別,而且物件也將不會被事務代理所包裝(將被確認為嚴重的)。因此,請接受Spring團隊的建議並且在具體的類上使用 @Transactional 註解。

在以上解決方法中,若將@Transactional 註解寫在介面上,則無法實現事務。所以請將 @Transactional 註解寫在實現類中!

本文章由[諳憶]編寫, 所有權利保留。
歡迎轉載,分享是進步的源泉。

相關推薦

問題解決<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5102021c7c110523303f22303225383e3f303d">[email&#160;protected]a>註解事務

Spring SpringMVC MyBatis框架中[email protected]註解事務無效解決方法 SpringMVC-Spring-MyBatis框架 資料庫:SQL SERVER 2008 以前都是用的MySQL資料庫,沒有

轉載解決方案:<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2f48465b6f48465b475a4d014c4042">[email&#160;protected]a>出現Permissi

遇到的問題 今天心血來潮,想將intellij上的專案程式碼放到GitHub上管理。 在進行新增遠端庫的時候,出現了:[email protected]出現Permission denied (publickey) 原因是 ./ssh目錄預設在C:\Users\VULCAN\.ssh,而我

Spring@<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4b0824253f392427272e390b192e3a3e2e383f062a3b3b22252c">[email&#160;pr

一 淺顯的感性理解 向瀏覽器宣告 @Controller 其作用簡單來說就是對瀏覽器宣告,此類為控制器類 @ResponseBody 作用在方法上,表明此函式返回的內容直接寫入HTTP Response物件 @RestController 是@ResponseBo

C++error LNK2019: 無法解析的外部符號 <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a6f9f1cfc8ebc7cfc8e69790">[email&#160;protected

原因:c語言執行時找不到適當的程式入口函式 解決:對於控制檯應用程式 1.選單中選擇 Project->Properties, 彈出Property Pages視窗 2.在左邊欄中依次選擇:Configuration Properties->C/C++->

Shelllinux bash Shell特殊變數:Shell $0, $#, $*, <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4f6b0f">[email&#160;protected]<

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949

<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ee8787868b9c81aeadbdaaa0">[email&#160;protected]a>專注於資料庫與資訊檢索技術

###[email protected]### ① 本部落格中文章,除轉載外,均為作者本人原創。請轉載時,尊重個人勞動,註明原始出處 ② 內容主要涉及資料庫相關理論技術、雲端計算及軟體架構專案管理 同時我也是Sybase, SQLAnywhereStudio, PostgreSQ

SpringSpring高階話題-計劃任務<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a68be6e3c8c7c4cac3f5c5cec3c2d3cacfc8c1">[email&#160;pr

進行本示例的演示,需要先配置好Maven和spring哦、 見:  http://blog.csdn.net/qq_26525215/article/details/53010442 分析 要實現計劃任務,首先通過在配置類註解@EnableScheduling來開

Spring定時任務詳解例項<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92bfd2c1f1faf7f6e7fef7f6">[email&#160;protected]a>

最近在做專案,時間比較緊張,也有比較久沒寫部落格了。 現在專案的Redis快取需要用到定時任務,就學習了一下Spring 的@Scheduled註解。使用起來很簡單。 這個例子是建立在之前我的一篇部落格的例項上面的。 也就是架好了SSM框架。 SSM

linux備忘筆記Linux root 從bash-3.2回到<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8af8e5e5fecae6e5e9ebe6e2e5f9fe">[email&#160;

1.進入目錄 cd /etc/skel 2.顯示隱藏檔案 ls -a   .bash_logout  .bash_profile  .bashrc  拷貝這些隱藏檔案到/home  接

<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a8dfc9c6cfd1cddcc9c7e8c4c1c6ddd0">[email&#160;protected]a>_u1604:~$最好的學習資

{ "job": "Currently in private enterprises engaged in PHP, Java, Android programming.", "work from date": "2014-08-21 09:00 ", "bo

學峰的學習筆記歡迎交流!郵箱是<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81f8e0efe6e2e9e0eeb0b8b9b6b1b5b0b5c1b0b7b2afe2eeec">[email&#

歡迎交流!郵箱是[email protected] 所有的部落格的pdf檔案版本都在網盤中可以下載: http://yunpan.cn/cdnAh7bcZjTgk 訪問密碼 d34f...

SpringSpring高階話題<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="012c41446f60636d64">[email&#160;protected]a>***註解的工作原理

@EnableAspectJAutoProxy @EnableAspectJAutoProxy註解 啟用Aspect自動代理 <aop:aspectj-autoproxy/> 開啟對AspectJ自動代理的支援。 在用到AOP的

Shell指令碼學習8Shell特殊變數:Shell $0, $#, $*, <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="83a7c3">[email&#160;protected]a>,

前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。 例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949 特殊變數列表 變數

Spring註解四、自動裝配@<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="723307061d051b00171654322017011d07001117">[email&#160;protec

四、自動裝配 [email protected]&@Qualifier和@Primary @Autowried是Spring2.5定義的自動裝配的註解,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 使用 @Au

MySQLAccess denied for user '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="34465b5b4074585b5755585c5b4740">[email&#160;pr

這個問題折磨了我幾個小時,現在把解決的過程記錄一下,希望對其他也遇到這個問題的人有所幫助。     我安裝的是MySQL5.7.14,在MySQL5.6之後root賬戶的預設密碼就不是空了,如果還是用空密碼登陸的話肯定一直報這個錯誤。要不就是忘記了安裝設定的密碼,要不就是自

解決碼雲出現<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b5c524f7b5c524f5e5e15585456">[email&#160;protected]a>: Permission de

很久之前好像改了ssh的一些配置,導致現在對git進行一些操作時,就會出現  當時就去百度,結果很多都是一些不太對應的解決方法,反正也沒有解決,今天偶然看碼雲的文件才突然解決。 官方解決文件:  http://git.mydoc.io/?t=154712 1)、重新生成

解決碼雲 <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d3b4baa793b4baa7b6b6fdb0bcbe">[email&#160;protected]a>: Permission den

 Git 操作碼雲專案出現問題:  [email protected]: Permission denied (publickey)  小烏龜(TortoiseGit)出現問題: Disconected: No supported au