1. 程式人生 > >spring事務管理UnexpectedRollbackException

spring事務管理UnexpectedRollbackException

在使用spring事務管理時,程式報如下: 
Java程式碼  收藏程式碼
  1. org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only  


程式的程式碼為: 
Java程式碼  收藏程式碼
  1.   serviceA.methiodA{  
  2.         beforedone;  
  3.         methodB();  
  4.         try{  
  5.            serviceB.methodB{}; //這裡面有異常標記為回滾, doSetRollbackOnly(status);
      
  6.     }catch{  
  7.         //捕獲異常轉到commit時,由於已經標記為要回滾, 回滾並丟擲新異常              
  8.         }  
  9. other done;  
  10.   }   

//傳播:propagation 為 Required 
原來是自己沒有弄懂spring事務的機制。 
這個方法被呼叫執行時,有兩個點是被spring事務代理。serviceA.methodA(),serviceB.methodB(),這兩個方法中只要有異常事件將回滾。 
(其實因為事務巢狀,serviceA#methodA中有異常標記並直接回滾,serviceB#methodB中有異常只是標記回滾狀態,在呼叫回serviceA#methodA中回滾)。 這個方法中serviceB#methodB有異常事務被標記為回滾,繼續執行到serviceA.methodA(), 可是被methodA捕獲了,也就不回滾了,一直執行到最後commit。在commit時spring會判斷回滾標誌,若有回滾標記,回滾並丟擲UnexpectedRollbackException異常。 


如何解決: 
上面就是serviceA#methodA中的方法不被serviceB#methodB影響。想到兩個方法好像都不是很好。 
Java程式碼  收藏程式碼
  1. 1. serviceB.methodB不宣告為事務代理。  
  2.    很多時候serviceB.methodB也被其他地方,是要事務管理的。這時候可以重寫一個方法。  
  3.    但是要注意這個方法中資料的一致性。  
  4. 2. 和1一樣也是重寫一個serviceB.methodBNE,裡面不丟擲異常,也要注意這個方法中資料的一致性。感覺是一樣的。  

個人感覺在使用盡量不捕獲異常,以保證事務一致性,如果有如上面的需求 
(如給所有人獎勵物品時,當中可能有人條件不足而丟擲異常,為不影響下面的要捕獲) 

可以獨立一個包出來專門做一個對多人操作的。而不是在同一個service寫兩個一樣的方法, 
導致混亂。 
不捕獲則在呼叫serviceB.methodB()時就回滾不會到commit那。 

從這次錯誤中可以得到: 
1.弄清楚被spring事務代理方法有哪些,這些方法有異常事務都將回滾 
  (不含this.methodB呼叫,動態代理導致) 

2. 被代理的方法內部有異常丟擲,事務都會標記為回滾,並在最外層呼叫那回滾。 
   巢狀事務若是REQUIRED_NEW新事務則在那個方法呼叫時直接回滾 
   如上面serviceA#methodA中直接回滾, serviceB#methodB則只標記 

3.在事務提交serviceA.methodA(最外層)中 
  commit(TransactionStatus)在具體提交事務之前會檢查rollBackOnly狀態, 
  如果該狀態在methodB中被設定,那麼轉而執行事務的回滾操作。 
  rollBackOnly狀態沒被設定,則執行正常的事務提交操作。 

相關推薦

spring事務管理UnexpectedRollbackException

在使用spring事務管理時,程式報如下:  Java程式碼   org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has b

spring事務管理 TransactionProxyFactoryBean源碼分析

java 事務管理 J2EE,當然離不開事務,事務又當然少不了Spring聲明式事務。spring聲明式事務,很多碼農門,應該和筆者一樣,停留在使用上,及僅僅了解點原理。如:Spring事務管理原理“代理+AOP”,再深入了解就不太清楚了。一直對聲明式事務實現特別感興趣,今天抽時間,剖析一下下。1.準

Spring事務管理

classpath 依賴 font word .get 執行 pointcut str 攔截 1、導入jar包 spring核心包 commons-logging.jar spring-beans.jar spring-context.jar spring-core.jar

Spring事務管理----------整合學習版

XML idt 類定義 dao mda info spring配置 讀取數據 blue 作者:學無先後 達者為先 Spring提供了一流的事務管理。在Spring中可以支持聲明式事務和編程式事務。 一 spring簡介 1 Spring的事務 事

spring事務管理,xml配置aop事務和註解配置aop事務

mov ref itcast template password nds eth poi ntc xml配置和註解配合共同代碼 AccountService.java public interface AccountService { //轉賬方法

spring 事務管理的簡單配置

ger string oot code nal chan 價格 nts 每次 1:事務的優點   事務管理對平時的業務邏輯的健壯性幫助很大,它保證了一個動作的原子性   本例中主要體現在,購票或者購書中,業務邏輯如下:     1:根據商品的ID查詢該商品的價格,     

(轉)spring事務管理幾種方式

pac jpg gets point aos load man classpath XML 轉自:http://blog.csdn.net/jeamking/article/details/43982435 前段時間對Spring的事務配置做了比較深入的研究,在此之間對

Spring事務管理API

logs 技術 -1 blog 9.png src es2017 http .cn Spring事務管理API

spring事務管理aop

jdbc tran err att get ted cor cep pack 達內12 note unit 09 01 1.spring事務管理 2.spring提供了對事務管理支持 spring采用aop機制完成事務控制 可以實現在不修改原有組件代碼情況下實現事務控制功能

Java Spring-事務管理概述

dot nat 框架 3.0 信息 commit int 效率 cti 2017-11-11 23:05:39 事務(Transaction):是邏輯上一組操作,要麽全都成功,要麽全都失敗。 一、事務的特性 原子性:事務不可分割 一致性:事務執行的前後,數據完整性保持一致

Spring---AOP註解開發&jdbc模板&Spring事務管理

use oca update -m spl pub tex com att 一、AOP註解開發   此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs

[Spring框架]Spring 事務管理基礎入門總結.

復制 tor junit4 dao img bubuko 說過 應該 pat 前言:在之前的博客中已經說過了數據庫的事務, 不過那裏面更多的是說明事務的一些鎖機制, 今天來說一下Spring管理事務的一些基礎知識. 之前的文章: [數據庫事務與鎖]詳解一: 徹底理解數據庫

Spring事務管理Transaction【轉】

集成 class advice nag batis spring3 ont weblogic tex Spring提供了許多內置事務管理器實現(原文鏈接:https://www.cnblogs.com/qiqiweige/p/5000086.html): DataSo

spring-事務管理

ring 並發 有一個 不一致 狀態 隔離 src AC 分享圖片 事務是一系列的動作,一旦其中有一個動作出現錯誤,必須全部回滾,系統將事務中對數據庫的所有已完成的操作全部撤消,滾回到事務開始的狀態,避免出現由於數據不一致而導致的接下來一系列的錯誤。事務的出現是為了確保數據

Spring -事務管理

比較 代碼量 數據庫操作 manager 而在 異常類 transacti cti 管理 Java事務導引 事務:正確執行一系列操作(或動作),使得數據庫從一種狀態轉移成另一種狀態,保證操作全部成功,或者全部失敗 事務原則:服從ISO/IEC指定的ACID原則

spring 事務管理

事務 spring 特性 一、事務的概念 事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。 二、事務的四個特性 1、原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務

Spring事務管理總結

需求 應用 def 關系數據庫 stat 啟動 全部 test data 事務定義   事務管理對於企業應用來說是至關重要的,主要作用是用來保證數據的一致性,比如轉賬問題。如下偽代碼所示: transaction begin A賬戶扣100 B賬戶加100

Spring事務管理 與 SpringAOP

nsf 新建 spring事務 釋放資源 pre pan 基本配置 特定 details 1,Spring事務的核心接口   Spring事務管理的實現有許多細節,如果對整個接口框架有個大體了解會非常有利於我們理解事務,下面通過講解Spring的事務接口來了解Spring實

spring事務管理實現原理-原始碼-傳播屬性-工作小結

本部落格分為兩點,一個是spring事務實現原理原始碼解讀(個人能力,初步解讀),二是spring事務的傳播屬性   簡單案例,儲存訂單,修改商品數量 就是這兩個方法,第一個方法中引用了第二個方法,都用@Transactional註解。debug呼叫shoppi