1. 程式人生 > >spring宣告事務失效問題

spring宣告事務失效問題

問題:
     在專案開發中遇到了一個spring事務失效的問題,檢查配置文件,都沒有問題,其他的類中的方法都能進行事務管理,而這個類中的方法卻不行。

分析
     檢視程式碼發現三個問題:
原因1、在方法內抓了異常,但是沒有往外拋。注:以前這個是手動事務,後來改成了宣告事務,而異常卻沒有往外拋。
當然這裡也可以使用手動事務,因為現在沒有使用connection的事務,所以使用PlatformTransactionManager 。
        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
        def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
        PlatformTransactionManager txManager = (PlatformTransactionManager )BeanLocator.getInstance().getBean("transactionManager"); 
        TransactionStatus transactionStatus = txManager.getTransaction(def);
        try{
                txManager.commit(transactionStatus); 
        } 
        catch (Exception e) { 
            logger.error("資料入庫失敗,不刪除檔案 fileName:" + file.getName(), e); 
            txManager.rollback(transactionStatus); 
        } 

原因2、儲存的方法設定為private,這樣spring無法進行代理。spring代理主要兩種方式,第一種是jdk動態代理,面向介面,無法代理private方法。 第二種是cglib方式,這個是以子類方式實現,由於方法設定為private導致這裡無法進行代理而事務失效。
原因3、Action呼叫了ServiceA的方法A,而方法A沒有宣告事務(原因是方法A本身比較耗時而又不需要事務)
ServiceA的方法A呼叫了自己的方法B,而方法B聲明瞭事務,但是方法B的事務宣告在這種情況失效了。
如果在方法A上也宣告事務,則在Action呼叫方法A時,事務生效,而方法B則自動參與了這個事務。
7359de86-4d44-310f-9122-25bed20bf427.jpg
因此,從上面的分析可以看出,methodB沒有被AopProxy通知到,導致最終結果是:被Spring的AOP增強的類,在同一個類的內部方法呼叫時,其被呼叫方法上的增強通知將不起作用。
   
      而這種結果,會造成什麼影響呢:
      1:內部呼叫時,被呼叫方法的事務宣告將不起作用
      2:換句話說,你在某個方法上宣告它需要事務的時候,如果這個類還有其他開發者,你將不能保證這個方法真的會在事務環境中
      3:再換句話說,Spring的事務傳播策略在內部方法呼叫時將不起作用

解決方案:
1、將該類的所有方法都加上事務,即所有方法都會被代理,這樣方法B事務才會生效。
2、呼叫時使用cglib生成的bean去呼叫方法B,比如說
public void A(){ 
        serviceA.B()
}

而不是直接使用this.B();

相關推薦

spring宣告事務失效問題(二)

上次談到spring的aop無法攔截內部方法呼叫時,解決方案之一是重新獲取代理類呼叫B方法。 下面說一下如何獲取到代理bean。 1、如果知道beanName直接通過上下文獲取到bean。 2、如果不

spring宣告事務失效問題

問題:      在專案開發中遇到了一個spring事務失效的問題,檢查配置文件,都沒有問題,其他的類中的方法都能進行事務管理,而這個類中的方法卻不行。 分析      檢視程式碼發現三個問題: 原因1、在方法內抓了異常,但是沒有往外拋。注:以前這個是手動事務,後來改成了宣告

spring管理事務失效的原因和No mapping found for HTTP request with URI []DispatcherServlet with name 'sprinmvc錯誤

練習了一個spring的事務配置問題,在搭建spring和springmvc時,考驗了一下事務,結果發現事務竟然失效了。這裡做一下總結。 一般我們在Spring的配置檔案application.xml中對Service層程式碼配置事務管理,可以對Service的方法進行AOP增強或事務處理如事務

Spring註解事務失效

最近搭建公司的專案的環境,發現註解事務失效,糾結了半天,找到了結果記錄一下。 註解事務發現springmvc.xml 和spring.xml 重複掃描導致的  <!-- 註解掃描包 -->    這個是springmvc.xml  掃描的時候排除servic

spring管理事務失效的原因和No mapping found for HTTP request with URI []DispatcherServlet with name 'sprinmvc錯誤

練習了一個spring的事務配置問題,在搭建spring和springmvc時,考驗了一下事務,結果發現事務竟然失效了。這裡做一下總結。 一般我們在Spring的配置檔案application.xml中對Service層程式碼配置事務管理,可以對Service的方法進行AO

Spring 宣告事務中transactionAttributes屬性 +

下面是一段典型的spring 宣告事務的配置: 檢視文字列印? <beanid="userDAOProxy"     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   

spring宣告事務 同一類內方法呼叫事務失效

前些日子一朋友在需要在目標物件中進行自我呼叫,且需要實施相應的事務定義,且網上的一種通過BeanPostProcessor的解決方案是存在問題的。因此專門寫此篇帖子分析why。 1、預備知識 使用AOP 代理後的方法呼叫執行流程,如圖所示 也就是說我們首先呼叫的是AOP代理物件而不是目標物件,首先

spring+springMVC,宣告事務失效,原因以及解決辦法

一.宣告式事務配置: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property

一次想不到的Spring事務失效問題跟蹤(事務不會滾)

spring srpingjdbc srpingtx 周末,鼓搗了下spring事務。spring事務配置其實很簡單,這是spring優點。但問題是,不知道其中原理,遇到點問題,就抓瞎了。我就犯傻了一次。在追蹤問題時,搜索到的答案,主要有以下幾類。springmvc 上下文,與service上下文

第十二講:12,spring宣告事務管理-註解式

1,複製專案spring404 ,改名spring404-3。修改BankServiceImpl類,添加註解,package com.cruise.service.impl;import org.springframework.transaction.annotation.Tra

第十一講:11.spring宣告事務管理-xml方式

1,複製專案spring404 ,改名spring404-2,修改BankServiceImpl類,刪除宣告式事務的程式碼。宣告式事務管理的方式缺點是,事務程式碼嚴重嵌入邏輯程式碼中 package com.cruise.service.impl; import org.springframewor

spring宣告事務管理方式( 基於tx和aop名字空間的xml配置[email&#

轉自:https://www.cnblogs.com/niceyoo/p/8732891.html 1. 宣告式事務管理分類 宣告式事務管理也有兩種常用的方式, 一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。 顯然基於註解的方式更簡單

Spring --16.Spring基於註解的宣告事務控制

1、建立子工程、引入依賴 (同上xml方式) 2、編寫相關類、(同上xml方式) 3、開啟Spring對註解的支援、配置事務管理、開啟Spring對註解的支援 applicationContext.xml <?xml version="1.0" encoding="UTF-

Spring --15.Spring中基於xml的宣告事務控制

開發環境: jdk1.8 Idea 2017 :Maven工程、引入父工程 Tomcat:apache-tomcat-8 Spring:5.0.7 一、事務控制 1、概述 事務的概念: 事務是邏輯上一組操作、組成這組操作各個邏輯單元、要麼一起成功、要麼一起失敗。 事

spring - 淺談spring事務管理(程式設計式,宣告式(XML版和註解版))

事務管理的目的:               將若干sql語句作為一個整體 , 要麼全部成功 , 要麼全部失敗! 事務套路:  &nb

Spring宣告事務(待更新)

四大特性:ACID 原子性:一個事務必須視為一個不可分割的最小工作單元,一個事務要麼全部完成,要麼全部失敗回滾,不可能只執行其中的一部分操作 一致性:事務執行的結果必須使資料庫從一個一致性狀態轉換到另一個一致性狀態,事務必須使資料庫始終保持一致性狀態 隔離性isolat

eclipse下maven管理Spring專案構:SpringAOP,基於XMl,基於註解宣告事務,及事務的傳播行為

一:在applicationContext.xml中加入 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  

9.spring事務管理(下):宣告事務管理

宣告式事務管理  sprin的宣告式事務是管理AOP技術實現的事務管理,其本質是是對方法前後進行攔截,然後 在目標方法開始之前建立或者加入一個事務,在執行完成目標方法之後根據執行情況提交或者回滾事務。   宣告式事務管理優點:不需要通過程式設計的方式管理事務,因而不需要在業務邏輯程

Spring 宣告事務

事務傳播機制 propagation:事務傳播機制有如下幾種: REQUIRED:預設值,表示如果存在一個事務,則支援當前事務;如果沒有事務,則開啟一個新事務。 REQUIRES_NEW:表示總是開啟一個新的事務,如果一個事務已經存在,則將這個存在的事務掛起,開啟新事務

spring系列】之14:spring宣告事務實現原理剖析

通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor