最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Spring事務傳播行為實戰(zhàn)

 更新時間:2019年09月02日 14:43:25   作者:西召  
這篇文章主要介紹了淺談Spring事務傳播行為實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Spring框架提供了事務管理的標準實現(xiàn),且可以通過注解或者XML文件的方式聲明和配置事務。

通過異步事件的方式解耦服務調用,可以提高程序的響應速度,并且避免因為事務傳播行為而導致的事務問題。

本文以一個電商平臺包裹出庫的業(yè)務為實際背景,通過異步事件與線程池的方式解耦嵌套事務,提高程序并發(fā)性能;為了便于問題的分析和方案的理解,同時還講解了Spring的事務管理,并著重介紹了幾種不同的事務傳播行為。

事務小貼士

什么是事務呢?簡單來講事務就是邏輯上的一組操作,這些操作要么都執(zhí)行,要么都不執(zhí)行。

什么是事務管理呢?所謂事務管理,其實就是“按照給定的事務規(guī)則來執(zhí)行事務的提交或者回滾操作”。

事務的機制實現(xiàn)很大一部依賴事務日志文件(undo log和redo log)。事務日志是一個與數(shù)據(jù)庫文件分開的文件。它存儲對數(shù)據(jù)庫進行的所有更改,并全部記錄插入、更新、刪除、提交、回退和數(shù)據(jù)庫模式變化。事務日志是備份和恢復的重要組件。

訂單出庫失敗

在訂單的包裹出庫之前,會將出庫指令下發(fā)到商城,其中包含包裹寄送的快遞信息,以便銷售平臺展示快遞跟蹤信息;同時,為了防止前端因為超賣或者重復下單等原因,已經(jīng)將訂單取消,會根據(jù)前端商城的返回狀態(tài)判斷訂單是否可以出庫。

其中,系統(tǒng)交互流程如下,在前端銷售平臺與WMS(倉儲管理系統(tǒng))之間,會有統(tǒng)一的OMS(訂單管理系統(tǒng))進行銷售單的管理和數(shù)據(jù)中轉。

當前端銷售平臺收到出庫信息以后,會進行如下的校驗與操作:

為了防止調用通知服務的時候出現(xiàn)異常,影響包裹出庫,調用通知服務的代碼是用try-catch語句包裹起來的。

但是,某些訂單在出庫的時候,還是出現(xiàn)了如下異常,出庫失敗:

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:873)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:710)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:534)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:305)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)

根據(jù)事務的傳播行為, Transaction rolled back because it has been marked as rollback-only 應該是因為被調用的事務回滾了,當調用一方提交事務的時候因為被標記為了 rollback-only ,因此無法正常提交。

Spring事務的傳播機制

下面我們詳細聊一下Spring事務的傳播機制。

Spring的 @Transactional 注解可以用于聲明方法支持事務,Spring底層通過AOP的方式實現(xiàn)事務的控制。

@Transactional 注解中的 Propagation 屬性可以用于指定事務的傳播行為。

/**
 * The transaction propagation type.
 * <p>Defaults to {@link Propagation#REQUIRED}.
 * @see org.springframework.transaction.interceptor.TransactionAttribute#getPropagationBehavior()
 */
Propagation propagation() default Propagation.REQUIRED;

在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。不支持當前事務。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。不支持當前事務。
  • TransactionDefinition.PROPAGATION_NEVER:

以非事務方式運行,如果當前存在事務,則拋出異常。不支持當前事務。

  • TransactionDefinition.PROPAGATION_REQUIRED: 如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。支持當前事務。
  • TransactionDefinition.PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。支持當前事務。
  • TransactionDefinition.PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。支持當前事務。
  • TransactionDefinition.PROPAGATION_NESTED: 如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。支持當前事務。

這里需要指出的是,前面的六種事務傳播行為是 Spring 從 EJB 中引入的,他們共享相同的概念。而 PROPAGATION_NESTED 是 Spring 所特有的。以 PROPAGATION_NESTED 啟動的事務內嵌于外部事務中(如果存在外部事務的話),此時,內嵌事務并不是一個獨立的事務,它依賴于外部事務的存在,只有通過外部的事務提交,才能引起內部事務的提交,嵌套的子事務不能單獨提交。如果熟悉 JDBC 中的保存點(SavePoint)的概念,那嵌套事務就很容易理解了,其實嵌套的子事務就是保存點的一個應用,一個事務中可以包括多個保存點,每一個嵌套子事務。另外,外部事務的回滾也會導致嵌套子事務的回滾。

利用事務傳播行為的解決方案

基于上面事務傳播行為的講解,可以將事務的傳播行為設置為 PROPAGATION_REQUIRES_NEW ,這樣當前事務與被調用事務將是兩個不同的事務,可以分別提交或者回滾。

在外層事務捕獲異常以后執(zhí)行如下代碼,會輸出 false ,說明內層事務回滾并未傳播給外層事務: TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()

而在內層事務執(zhí)行如下代碼,會返回 true ,說明內層事務是一個新的事務,在執(zhí)行改事務的時候,當前事務會被掛起: TransactionAspectSupport.currentTransactionStatus().isNewTransaction()

這樣就解決了try-catch塊拋出異常因事務傳播行為導致的當前事務無法提交的問題。

利用多線程的解決方案

我們知道,在不同的線程之間,事務是獨立的。對于發(fā)送通知消息這樣的業(yè)務,適合通過拋出事件的方式,然后通過異步監(jiān)聽器進行處理。

其流程如下:

至于事件模型的實現(xiàn)方式,無論是分布式的Zookeeper、Redis和MQ,還是非分布式的Guava Event Bus、Spring Event都可以,可以根據(jù)實際需要選擇。其核心原理仍然是發(fā)布訂閱模式。

參考鏈接

數(shù)據(jù)庫事務的方方面面

可能是最漂亮的Spring事務管理詳解

Transaction必知必會

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java實現(xiàn)圖片轉ascii字符畫的方法示例

    java實現(xiàn)圖片轉ascii字符畫的方法示例

    這篇文章主要介紹了java實現(xiàn)圖片轉ascii字符畫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java 獲取當前設備的 IP 地址(最新推薦)

    Java 獲取當前設備的 IP 地址(最新推薦)

    Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡的每個設備的標識符,該標識符用于識別和定位中間通信的節(jié)點,這篇文章主要介紹了在 Java 中獲取當前設備的 IP 地址,需要的朋友可以參考下
    2023-06-06
  • 使用java實現(xiàn)手機短信驗證全過程

    使用java實現(xiàn)手機短信驗證全過程

    這篇文章主要介紹了使用java實現(xiàn)手機短信驗證全過程,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java使用OpenCV3.2實現(xiàn)視頻讀取與播放

    Java使用OpenCV3.2實現(xiàn)視頻讀取與播放

    這篇文章主要為大家詳細介紹了Java使用OpenCV3.2實現(xiàn)視頻讀取與播放,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • mybatis映射文件操作存儲過程的實現(xiàn)

    mybatis映射文件操作存儲過程的實現(xiàn)

    本文主要介紹了mybatis映射文件操作存儲過程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • redis之基于SpringBoot實現(xiàn)Redis stream實時流事件處理方式

    redis之基于SpringBoot實現(xiàn)Redis stream實時流事件處理方式

    這篇文章主要介紹了redis之基于SpringBoot實現(xiàn)Redis stream實時流事件處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Java編程中protected修飾符與static修飾符的作用

    詳解Java編程中protected修飾符與static修飾符的作用

    這篇文章主要介紹了Java編程中protected關鍵字與static關鍵字的作用,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2016-01-01
  • Java實現(xiàn)導出合并Excel單元格

    Java實現(xiàn)導出合并Excel單元格

    隨著數(shù)據(jù)的不斷增長,很多時候需要將數(shù)據(jù)導出到Excel中進行分析、處理和展示。本文將介紹如何使用Java實現(xiàn)Excel導出,并且可以合并單元格,需要的可以參考一下
    2023-04-04
  • java實現(xiàn)隨機生成UUID

    java實現(xiàn)隨機生成UUID

    這篇文章主要介紹了java實現(xiàn)隨機生成UUID的函數(shù)代碼,有需要的小伙伴可以參考下。
    2015-07-07
  • java中建立0-10m的消息(字符串)實現(xiàn)方法

    java中建立0-10m的消息(字符串)實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava中建立0-10m的消息(字符串)實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

汾阳市| 汉中市| 政和县| 迭部县| 田东县| 永年县| 益阳市| 黑龙江省| 怀仁县| 临泽县| 定安县| 天镇县| 伊吾县| 英吉沙县| 龙里县| 库尔勒市| 屯留县| 建德市| 江阴市| 万荣县| 台湾省| 合川市| 新干县| 仪征市| 蓝田县| 昭通市| 东台市| 无极县| 南和县| 岳阳市| 中山市| 垣曲县| 临澧县| 明光市| 蓬溪县| 宁武县| 汨罗市| 庆阳市| 昆山市| 静海县| 噶尔县|