Spring事務傳播機制

hi ,大家好,繼續為大家帶來Spring事務傳播機制的相關知識
在這里插入圖片描述

文章目錄

  • 🤗1.事務傳播機制是什么
  • 🤗2.事務傳播機制作用
  • 🤗3.事務傳播機制

🤗1.事務傳播機制是什么

定義了多個包含了事務的?法,相互調?時,事務是如何在這些?法間進?傳遞的

🤗2.事務傳播機制作用

事務隔離級別是保證多個并發事務執?的可控性的(穩定性的),而事務傳播機制是保證?個事務在多個調用方法間的可控性的(穩定性的)
在這里插入圖片描述上面的圖片很好的解釋了事務傳播機制和事務隔離級別的流程

🤗3.事務傳播機制

Spring事務傳播機制定義了在多個事務方法相互調用時,不同事務方法間事務處理的行為方式。Spring框架提供了7種不同的事務傳播行為方式,分別是:

  1. REQUIRED:默認的傳播行為,如果當前存在事務,則加入該事務,否則創建一個新事務。
    在這里插入圖片描述
    這個來通俗的解釋一下,如果當前方法沒有開啟事務,就會創建一個新的事務,如果存在事務就會加入該事務
    在這里插入圖片描述
    我們在用代碼驗證一下
    在這里插入圖片描述
    在這里插入圖片描述
    因為此時的級別默認是required,所以應該是一個大事務,有一個有異常 ,其余的也就添加失敗
    在這里插入圖片描述

在這里插入圖片描述
可以從數據庫中看到,并未添加數據

  1. SUPPORTS:如果當前存在事務,則加入該事務,否則不使用事務。
    在這里插入圖片描述
    如果A 沒有開啟事務,那么就以非事務的方式運行,后面的方法看到該調用鏈沒有事務就也會擺爛,因此即使報了異常,也繼續添加,
    看代碼
    在這里插入圖片描述
    在這里插入圖片描述

在這里插入圖片描述
3 MANDATORY:當前方法必須在事務中執行,存在事務,就會加入該事務,如果不存在事務,則拋出異常。

4.REQUIRES_NEW:表示創建?個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部?法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部?法會新開啟??的事務,且開啟的事務相互獨?,互不?擾。

5.NOT_SUPPORTED:以?事務?式運?,如果當前存在事務,則把當前事務掛起

6.NEVER:當前方法不能在事務中執行,如果存在事務,則拋出異常。

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
可以清楚的看到沒有插入
在這里插入圖片描述
控制臺連受影響的行數都沒有打印,直接拋出異常

這個NESTED比較繞😭,我們一起努力,沖沖沖!😜

7.NESTED:創建一個嵌套事務,如果當前存在事務,則將該事務作為嵌套事務的父事務,如果父事務提交,則嵌套事務會提交,否則回滾。
如果當前沒有事務,則該取值等價于 PROPAGATION_REQUIRED。
執行流程
在這里插入圖片描述

當沒有事務,創建事務,后續方法會生成嵌套事務,并且有一個保存點,一旦該事務出現問題,就會回滾到上一個事務保存點,不會影響其他事務的執行

package com.example.demo.controller;import com.example.demo.model.Userinfo;
import com.example.demo.service.UserService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.pattern.PathPattern;//測試類@RestController@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/add")@Transactional(propagation = Propagation.REQUIRED)public  int  add(){Userinfo userinfo=new Userinfo();userinfo.setUsername("老七");userinfo.setPassword("123");int result=    userService.add(userinfo);System.out.println("受影響的行數是"+result);userService.insert(userinfo);return result;}
}
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.Userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactional(propagation = Propagation.NESTED)public int  add(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影響的行數"+result);return  result;}@Transactional(propagation = Propagation.NESTED)public int insert(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影響的行數"+result);int num=10/0;return  result;}
}

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
數據庫是啥也沒插入的,為啥呢?不是說會回滾到上一個事務保存點嗎?所以應該插入一條,為啥一條也沒有
因為:在這里插入圖片描述
第三個出了問題,那么創建事務的作為調用方,一定可以感知到異常,那么整個事務就會回滾,所以一條都不會插入
所以某個方法報異常不要讓總的調用者感知到,就不會全部回滾,那么可以采用如下方式
在這里插入圖片描述
修改這里的代碼,讓該方法感知到異常即可,不讓總方法感知到,那么就會執行回滾操作,回滾到上一個事務保存點,所以只會插入一條數據

在這里插入圖片描述
在寫這個例子的時候,我們特意修改,不在add方法里面調用insert方法,而是在userController中調用,為什么呢?
🤗🤗🤗因為NESTED嵌套NESTED的時候,上一個NESTED保存點設置不上,這兩個保存點會進行合并,合并成一個臨時任務,那么一個掛掉,兩個都掛了,所以在總的調用方法中調用它,才能有效果
再舉一個例子:

公司雇了一個清潔工A,清潔工自己有又雇了一個清潔工B,當清潔B干了壞事,那么公司就會把A和B同時開除,當公司雇了兩個清潔工,其中一個清潔工出了問題,就開掉出問題的那個就好,沒出問題的留下~

這個例子就對應了代碼的執行過程~

今天就講到這里,我們下期再見,886!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37249.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++教程 - How to C++系列專欄第3篇

關于專欄 這個專欄是優質的C教程專欄,如果你還沒看過第0篇,點擊C教程 - How to C系列專欄第0篇去第0篇 本專欄一致使用操作系統:macOS Ventura,代碼編輯器:CLion,C編譯器:Clang 感謝一路相伴…

[C++ 網絡協議編程] UDP協議

目錄 1. UDP和TCP的區別 2. UDP的工作原理 3. UDP存在數據邊界 4. UDP的I/O函數 4.1 sendto函數 4.2 recvfrom函數 4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服務器端通信流程 5.2 客戶端通信流程 1. UDP和TCP的區別 主要…

從安全角度分析Angular本地存儲

隨著Web應用程序的不斷增長,前端開發人員慢慢意識到使用瀏覽器提供的本地存儲技術可以在不使用外部數據庫的情況下方便地保存應用程序的數據。Angular作為目前最流行的前端框架之一,也在其API中提供了許多本地存儲技術的支持。但是,在使用本地…

Electron教程_編程入門自學教程_菜鳥教程-免費教程分享

教程簡介 Electron是一個是使用JavaScript,HTML和CSS構建跨平臺的桌面應用程序框架。 Electron 通過將 Chromium 和 Node.js 合并到同一個運行時環境中,并將其打包為 Mac,Windows 和 Linux 系統下的應用來實現這一目的。 Electron入門教程 …

【深度學習】日常筆記16

可以將pd.DataFrame數據結構理解為類似于Excel中的表格。pd.DataFrame是pandas庫提供的一個二維數據結構,用于存儲和操作具有行和列的數據。它類似于Excel中的工作表,其中每一列可以是不同的數據類型(例如整數、浮點數、字符串等)…

關于安卓打包生成aar,jar實現(一)

關于安卓打包生成aar,jar方式 背景 在開發的過程中,主項目引入三方功能的方式有很多,主要是以下幾個方面: (1)直接引入源代碼module(優點:方便修改源碼,易于維護&#…

Spring_AOP

一、AOP簡介 AOP,Aspect Oriented Programming,面向切面編程,是對面向對象編程0OP的升華。OOP是縱向對一個事物的抽象,一個對象包括靜態的屬性信息,包括動態的方法信息等。而AOP是橫向的對不同事物的抽象,屬性與屬性、方法與方法、對象與對象…

算法訓練營題目day17

110. 平衡二叉樹 給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為: 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。 func isBalanced(root *TreeNode) bool {h:getHeight(root)if h -1{r…

Vue 安裝開發者工具

1.下載開發者工具,下載地址:http://book.wiyp.top/App/Vue3開發者工具-谷歌/Vue3.crx 2.打開谷歌瀏覽器,點擊擴展,點擊管理擴展程序。 3.開啟開發者模式,將 Vue3 開發者工具文件拖拽到瀏覽器中進行安裝。 注&#xff…

chatGPT小白快速入門培訓課程-001

一、前言 本文是《chatGPT小白快速入門培訓課程》的第001篇文章,全部內容采用chatGPT和chatGPT開源平替軟件生成。完整內容大綱詳見:《chatGPT小白快速入門課程大綱》。 本系列文章,參與: AIGC征文活動 #AIGC技術創作內容征文# …

使用pymupdf實現PDF內容搜索并顯示功能

簡介: 在日常工作和學習中,我們可能需要查找和提取PDF文件中的特定內容。本文將介紹如何使用Python編程語言和wxPython圖形用戶界面庫來實現一個簡單的PDF內容搜索工具。我們將使用PyMuPDF模塊來處理PDF文件,并結合wxPython構建一個用戶友好的…

動態HTTP代理與競爭情報收集的關聯

Hey,各位爬友們!作為一名專業的爬蟲HTTP代理提供者,今天我要和大家聊一聊動態HTTP代理與競爭情報收集之間的關聯。在這篇文章中,我將向大家解釋怎么使用動態HTTP代理完成在競爭中的情報收集,并分享一些實用的技巧。 首…

虹科方案 | 汽車總線協議轉換解決方案(二)

上期說到,虹科的PCAN-LIN網關在CAN、LIN總線轉換方面有顯著的作用,尤其是為BMS電池通信的測試提供了優秀的解決方案。假如您感興趣,可以點擊文末相關鏈接進行回顧! 而今天,虹科將繼續給大家帶來Router系列在各個領域的…

Netty:判斷ByteBuf底層是否被NIO direct buffer支撐

說明 io.netty.buffer.ByteBuf的函數isDirect()可以判斷該ByteBuf底層是否被NIO direct buffer支撐。如果結果返回true,表示底層被NIO direct buffer支撐。 示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; imp…

elasticsearch 基礎

ES 搜索技術歷史 今天看的是《Elasticsearch實戰與原理解析》 第一章 搜索技術發展史 1、搜索技術發展史 宏觀而言,搜索引擎的發展經歷了五個尖端和兩大分類。五個階段分別是ftp文件檢索階段、分類目錄階段、文本相關性檢索階段、網頁鏈接分析階段和用戶意圖識別…

算法leetcode|69. x 的平方根(rust重拳出擊)

文章目錄 69. x 的平方根:樣例 1:樣例 2:提示: 分析:題解:rust:go:c:python:java: 69. x 的平方根: 給你一個非負整數 x &#xff0c…

win10電腦npm run dev報錯解決

npm run dev報錯解決 出現錯誤前的操作步驟錯誤日志解決步驟 出現錯誤前的操作步驟 初始化Vue項目 $ npm create vue3.6.1創建項目文件夾client Vue.js - The Progressive JavaScript Framework? Project name: ? client ? Add TypeScript? ? No ? Add JSX Support? …

【Pytorch:nn.Embedding】簡介以及使用方法:用于生成固定數量的具有指定維度的嵌入向量embedding vector

文章目錄 1、nn.Embedding2、使用場景 1、nn.Embedding 首先我們講解一下關于嵌入向量embedding vector的概念 1)在自然語言處理NLP領域,是將單詞、短語或其他文本單位映射到一個固定長度的實數向量空間中。嵌入向量具有較低的維度,通常在幾…

計算機網絡中速率和帶寬的區別

速率,指的是連接在計算機網絡上的主機在數字信道上傳送數據的速率,它也稱為數據率或比特率,單位是bps。速率往往指的是額定速率或者標稱速率,意思也就是在非常理想的情況下才能達到的數據傳送的速率,然而在現實生活中是…

[Mongodb 5.0]單機啟動

安裝完mongodb后,會自動生成下面兩個目錄(mongod.conf中設定的),用來存放日志和數據 /var/lib/mongo (數據目錄) /var/log/mongodb (日志目錄) 要啟動一個單機版的mongodb,一般有兩種方式: 第一種啟動方式:直接使用…