javax.persistence.RollbackException: Transaction marked as rollbackOnly異常出現的原因以及避免方法
這次的需求是實現匯入功能,要求:如果匯入的內容以及存在,那就以excel表格的形式反饋給使用者,並且告知使用者每一行的錯誤原因;如果該條記錄資料庫中不存在,那麼就新增到資料庫中。
一開始,我的思路是在執行save操作時用try-catch包圍,如果catch到了異常,那麼就將這個對像放到errors中,在最後將errors匯出成excel。
但是問題來了,由於我的repository是繼承自JPARepository的,並且為了提高插入的效率,在service中加了@Transactional(noRollbackFor = Exception.class)註解。正是因為加了這個註解,所以導致了javax.persistence.RollbackException: Transaction marked as rollbackOnly異常的發生。
下面先來舉個小列子
@Transactional(noRollbackFor = Exception.class)
Public void A(){
for(int 1=0;i<10;i++)
try{
add(i);
}catch(Exception e){
輸出(i);
}
}
@Transactional
Public void add(int i){
if(i>5)
Throw a exception//假設丟擲一個異常
將 i 插入到資料庫中
}
在這種情況下就會出現javax.persistence.RollbackException: Transaction marked as rollbackOnly異常。
當在A方法中執行B方法時,雖然A方法加了 noRollbackFor = Exception.class ,但是由於呼叫的B方法沒有加,並且在B中丟擲了異常,那麼就會報這個錯誤,也無法達到我的目的,即插入0到5這幾個數字,而是會全部回滾。
我的需求跟這個類似,我本來想通過try-catch來捕捉到插入失敗的物件,然後分析異常原因,再匯出給使用者,好讓他們修改完之後再上傳。但是我呼叫Jpa的sava方法,它本身的實現中就加了@Transactional,沒有加noRollbackFor = Exception.class,因此即便我在service方法中加了@Transactional(noRollbackFor = Exception.class),也會回滾。
下面我的解決方法是進行預處理,在插入之前先進行判重,即將考試表中的考題拿出來,為了提高判重效率,先將String的考題構建Hash值,然後進行比較,這樣的比較速度會大大提高。程式碼如下
@Transactional
public Map<String, Object> save(List<Exam> exams) {
Map<String, Object> error = new HashMap<>();
List<Exam> errors = new ArrayList<>();
List<String> errorMsgs = new ArrayList<>();
List<String> tests = repo.findTests();
List<Integer> testHashcodes = new ArrayList<Integer>();
for (String test : tests) {
testHashcodes.add(test.hashCode());
}
int hashcode = -1;
for (Exam exam : exams) {
hashcode = exam.getTest().hashCode();
if (testHashcodes.contains(hashcode)) {
errors.add(exam);
errorMsgs.add("題目重複");
} else {
repo.save(exam);
testHashcodes.add(hashcode);
}
}
error.put("errors", errors);
error.put("errormsg", errorMsgs);
return error;
}
相關推薦
javax.persistence.RollbackException: Transaction marked as rollbackOnly異常出現的原因以及避免方法
這次的需求是實現匯入功能,要求:如果匯入的內容以及存在,那就以excel表格的形式反饋給使用者,並且告知使用者每一行的錯誤原因;如果該條記錄資料庫中不存在,那麼就新增到資料庫中。 一開始,我的思路是在執行save操作時用try-catch包圍,如果catch到了異常,那麼就
使用JPA保存對象時報nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly錯誤
exce ack exceptio jpa 實現 style 結果 enc 字段 使用JPA保存對象時報nested exception is javax.persistence.RollbackException: Transaction marked as rollba
easyUI datagrid 多行多列數據渲染異常緩慢原因以及解決方法
後端 http 前後端 公司 發送請求 class 之前 vue 做的 原因 最近,在優化之前公司幫聯想(外包)做的一個老的後臺管理系統,由於項目是基於easy UI框架,頁面是後臺用jsp實現的,再加上在公司推行前後端分離的實踐,大部分項目都基於vue采用前後端分離去實現
spring事務(Transaction )報 marked as rollback-only異常的原因及解決方法
很多朋友在使用spring+hibernate或mybatis等框架時經常遇到報Transaction rolled back because it has been marked as rollback-only的異常,這個異常是怎麼造成的 呢,下面將給大家進行詳細的分析。 &nbs
Spring-Boot 出現Transaction marked as rollback only異常
最近在開發的過程中遇到了使用Transaction marked as rollback only的問題,瞭解到報錯的原因: 應該是事務被rollback了多次導致的錯誤。仔細看程式碼,由於專案中在aop切面、控制層、service分別開啟了一次事務,而
Transaction marked as rollback-only異常
1、當整個方法中每個子方法沒報錯時,整個方法執行完才提交事務,如果某個子方法有異常,spring將該事務標
ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘XXX’ 異常的原因及解決方法
ase wan oca conn sna aspect ava 配置 ng- ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘X
ConcurrentModificationException: 集合異常——產生原因和解決方法!
:注意事項:迭代器在使用的時候,有人為了方便,如下使用就會有問題 System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge()); 注意事項:迭代器在使用的時候,有人為了方便,如下使
【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常的原因和解決方法
JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變
socket is closed異常的原因及其解決方法
在一個有關socket的程式中,客戶端出現了 socket is closed異常,我百思不得其解,並沒有關閉socket啊。 下面首先來分析一下這個異常出現的原因:該異常在客戶端和伺服器均可能發生。異常的原因是己方主動關閉了連線後(呼叫了Socket的clo
出現 org.springframework.beans.factory.BeanCreationException 異常的原因及解決方法
1 異常描述 在從 SVN 檢出專案並配置完成後,啟動 Tomcat 伺服器,報出如下錯誤: 2 異常原因 通過觀察上圖中被標記出來的異常資訊,咱們可以知道 org.springframework.beans.factory.BeanCre
ClassCastException異常的出現原因和解決方法
ClassCastException是JVM在檢測到兩個型別間轉換不相容時引發的執行時異常。此類錯誤通常會終止使用者請求。在執行任何子系統的應用程式程式碼時都有可能發生ClassCastException異常。通過轉換,可以指示Java編譯器將給定型別的變數作為
出現 org.apache.ibatis.binding.BindingException 異常的原因及解決方法
1 異常描述 在對資料庫表中現有敏感資訊(例如姓名、手機號、身份證號、銀行卡號等)進行加密處理的時候,報出如下錯誤: 2 異常分析 通過觀察上圖中被標記出來的異常資訊,我們可以知道 org.apache.ibatis.binding.Bindi
出現 java.net.ConnectException: Connection refused 異常的原因及解決方法
1 異常描述在啟動 Tomcat 伺服器的時候,控制檯一直輸出異常資訊,然後停止伺服器,報出如下異常:2 異常原因通過觀察上圖中被標記出來的異常資訊,咱們可以知道java.net.ConnectException: Connection refused此異常,為:連線被拒絕異
使用getSessionFactory().getCurrentSession()獲取session出現異常的原因及解決方法
出問題的地方:具體異常:org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current threadat org.springframework.o
驗證碼 getOutputStream() has already been called for this response異常的原因和解決方法
1.tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法在tomcat5下jsp中出現此錯誤一般都是在jsp中使用了輸出流(如輸出圖片驗證碼,檔案下載等),沒有妥善處理好的原因。 具體的原因就是在
Transaction rolled back because it has been marked as rollback-only
解決辦法 框架 捕獲 back 結束 tro 接口 lba -o 出現這種錯誤的原因 1.接口A 調用了接口B 2.接口B報異常了,沒有在B裏面進行try catch捕獲 3.接口A對 接口B進行了try catch捕獲 因為接口B報異常 會把當前事物A接口的事物(如果B沒
Transaction rolled back because it has been marked as rollback-only分析解決方法
1. Transaction rolled back because it has been marked as rollback-only事務已回滾,因為它被標記成了只回滾<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>q
Hibernate異常:NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/
在進行JUnit4測試時,拋異常: Caused by: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey; at org.
No qualifying bean of type [javax.persistence.EntityManage] 異常問題的解決
引言: 在Spring Web專案中一般都會使用OpenEntityManagerInViewFilter來保證JPA session的正常關閉,在筆者的專案中,使用了Spring + Spring Data + JPA + Hibernate來的架構來組織專案,碰到了or