1. 程式人生 > >Spring-Boot 出現Transaction marked as rollback only異常

Spring-Boot 出現Transaction marked as rollback only異常

最近在開發的過程中遇到了使用Transaction marked as rollback only的問題,瞭解到報錯的原因:

應該是事務被rollback了多次導致的錯誤。仔細看程式碼,由於專案中在aop切面、控制層、service分別開啟了一次事務,而在service裡報錯的時候本來在service層已經進行了一次rollback,但是由於在aop環繞切面的時候也開啟了事務,捕獲到了來自service的異常,於是同一個事務就進行了rollback兩次(僅是個人經驗的猜測,文章有錯請各位大佬指出)
@Transactional配置:
事務隔離級別:TransactionDefinition.ISOLATION_DEFAULT
事務傳播行為:TransactionDefinition.PROPAGATION_REQUIRED

解決方案

在org.springframework.transaction.support.AbstractPlatformTransactionManager 中有個叫
isGlobalRollbackOnParticipationFailure的引數,預設是true.
原始碼中說明:

Switch this to “false” to let the transaction originator make the rollback decision. If a participating transaction fails with an exception, the caller can still decide to continue with a different path within the transaction. However, note that this will only work as long as all participating resources are capable of continuing towards a transaction commit even after a data access failure: This is generally not the case for a Hibernate Session, for example; neither is it for a sequence of JDBC insert/update/delete operations.

大意是:如果isGlobalRollbackOnParticipationFailure為false,則會讓主事務決定回滾,如果當遇到exception加入事務失敗時,呼叫者能繼續在事務內決定是回滾還是繼續。然而,要注意是那樣做僅僅適用於在資料訪問失敗的情況下且只要所有操作事務能提交。

xml

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory"
> <ref bean="sessionFactory" /> </property> <property name="globalRollbackOnParticipationFailure" value="false" /> </bean>

spring-boot

@Configuration
@Lazy
@MapperScan("cn.blockchain.core.mapper")
@EnableTransactionManagement(order = 8)
public class TransactionConfig {
    @Bean
    public PlatformTransactionManager txManager(com.alibaba.druid.pool.DruidDataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
        dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(false);
        return dataSourceTransactionManager;
    }
}

參考:

相關推薦

Spring-Boot 出現Transaction marked as rollback only異常

最近在開發的過程中遇到了使用Transaction marked as rollback only的問題,瞭解到報錯的原因: 應該是事務被rollback了多次導致的錯誤。仔細看程式碼,由於專案中在aop切面、控制層、service分別開啟了一次事務,而

Transaction marked as rollback-only異常

1、當整個方法中每個子方法沒報錯時,整個方法執行完才提交事務,如果某個子方法有異常,spring將該事務標

spring事務(Transaction )報 marked as rollback-only異常的原因及解決方法

很多朋友在使用spring+hibernate或mybatis等框架時經常遇到報Transaction rolled back because it has been marked as rollback-only的異常,這個異常是怎麼造成的 呢,下面將給大家進行詳細的分析。 &nbs

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

Transaction rolled back because it has been marked as rollback-only解決方案

預設spring事務只在發生未被捕獲的 runtimeexcetpion時才回滾。spring aop 異常捕獲原理:被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexcep

Srping Transaction rolled back because it has been marked as rollback-only解決方案

1.異常相關描述 如題,此異常的全部資訊如下: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked a

Spring-Boot 事務@Transaction註解不回滾異常處理

測試:    模擬使用jpa連續插入資料到資料庫,並開啟事務    其中4、6因為超出長度限制。    按道理會觸發回滾操作,但是不然。。。日誌明明顯示觸發回滾操作了,但是資料庫的資料卻沒有達到原子性    解決辦法:        由於@Transaction註解,在MyS

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

Spring boot出現Cannot determine embedded database driver class for database type NONE

文件配置 ati ber local ive support auto clu 排除 在spring boot項目中,我們在pom.xml文件中添加了mysql和mybatis的依賴,我們常常遇到下面這樣的問題: Description: Cannot determ

IDEA執行spring boot 出現Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletCont

idea 啟動專案的時候報錯(Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean),主要是以下的依賴     &l

Vue專案部署在Spring Boot出現頁面空白問題的解決方案

網上流行的解決方案是將assetsPublicPath: ‘/‘改成’./’,下面說一下這個解決方案的弊端: 通常頁面空白的問題出現大多數是由於Spring Boot端配置了server.servlet.context-path,上下文改變了css, js等檔案的訪問路徑,檔案無法載入導

Spring Boot出現Request method 'POST' not supported,深入原始碼原因分析

工程 專案靜態資源目錄結構 testConverter.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

Spring Boot 出現Cannot load driver class: com.mysql.jdbc.Driver

最近將一個原先的一個小demo改為Spring Boot框架,準備執行一下專案的,但出現問題Cannot load driver class: com.mysql.jdbc.Driver 現對該問題做

Spring Boot 出現java.lang.NoClassDefFoundError: org/apache/tomcat/util/security/Escape錯誤

Spring Boot整合Jsp的過程中,編譯報出如下錯誤。 2018-03-15 22:04:45.166 ERROR 7240 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]

Spring Boot-錯誤處理及自定義全域性異常處理機制

正常的Web應用開發時,需要考慮到應用執行發生異常時或出現錯誤時如何來被處理,例如捕獲必要的異常資訊,記錄日誌方便日後排錯,友好的使用者響應輸出等等。 當然應用發生錯誤,有可能是應用自身的問題,也有可能是客戶端操作的問題。 Spring Boot預設提供了一種錯誤處理機制。 預設錯誤處理機制

Spring Boot 統一返回資料結構以及全域性異常處理

前言 看了廖師兄的視訊後,結合自己以前的程式設計經驗總結下 : 在 web 開發過程中, 後端要統一返回的資料結構,便於前端處理。例如每個請求,我們都需要知道 : code : 伺服器返回的狀態碼(主要給程式設計師看)。例如 : 200 : 請求成功。

Spring Boot 學習筆記(十三)——全域性異常處理

預設異常處理機制 1、Whitelabel Error Page 當客戶端訪問頁面不存在,或服務端處理髮生異常,一般瀏覽器客戶端傳送的請求頭中為:Accept:text/html;所以就返回一個html文件。 這裡有一個很重要的類:BasicErrorContr

Spring Boot HTTP over JSON 的錯誤碼異常處理

作者:泥瓦匠 本文提綱 一、異常統一處理的使用場景 二、執行 springboot-validation-over-json 工程 三、springboot-validation-over-json 工程程式碼詳解 一、異常統一處理的使用場景 在前後端分離開發中,經常用 HTTP over J