Spring事務的實現方式和實現原理;事務聲明的方式,Spring的事務傳播行為,spring事務的實現原理

Spring事務的實現方式和實現原理

Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。

什么是事務
數據庫事務是指作為單個邏輯工作單元執行的一系列操作,這些操作要么一起成功,要么一起失敗,是一個不可分割的工作單元。

在我們日常工作中,涉及到事務的場景非常多,一個 service 中往往需要調用不同的 dao 層方法,這些方法要么同時成功要么同時失敗,我們需要在 service 層確保這一點

事務的四大特性:A:原子性 C:一致性 I:隔離性 D:持久性

Spring支持的事務管理類型, spring 事務實現方式有哪些?

Spring支持兩種類型的事務管理:

編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。

聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。

Spring中事務的實現方式

1、編程式—實現事務

? 在applicationContext.xml中配置好數據源,和事務管理器:

在這里插入圖片描述

以上這種方式 不推薦使用,代碼入侵太多。大量的處理事務的代碼穿插到業務代碼中

在這里插入圖片描述

2、聲明式—實現事務

(1)、聲明式事務:xml形式 提前配置好數據源

  • 配置事務管理器
  • 配置通知,添加事務的切面
  • Aop的織入,將切面和切入點綁定起來

在這里插入圖片描述

(2)、configration配置類的形式配置聲明式事務

? 1、配置好數據源信息 2、配置事務管理器 3、開啟事務的注解支持

在這里插入圖片描述

將該配置類添加到包掃描路徑下,接來下就可以直接在service的方法或者類上使用@Transactional注解給方法添加事務

(3)、xml+注解方式配置聲明式事務

在這里插入圖片描述

配置完成后,只需要在想要開啟注解的方法上加上@Transactional注解就可以了

說一下Spring的事務傳播行為

spring事務的傳播行為說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為。

① PROPAGATION_REQUIRED:默認的事務傳播,如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。

② PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。

③ PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。

④ PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。

⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

⑥ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

⑦ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則按REQUIRED屬性執行。

在一個事務執行的過程中,調用另一個事務時候(比如一個service方法調用另一個service方法),這個事務將以何種狀態存在,是兩個事務共存呢,還是一個事務是另一個事務的子事務,還是一個事務加入另一個事務的子事務呢……利用事務的傳播性來解決這個問題。

? 1、REQUIRED: spring默認的事務的傳播性
? REQUIRED 表示如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。

@Service
public class AccountService {@AutowiredJdbcTemplate jdbcTemplate;@Transactionalpublic void handle1() {jdbcTemplate.update("update user set money = ? where id=?;", 1, 2);}
}
@Service
public class AccountService2 {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredAccountService accountService;public void handle2() {jdbcTemplate.update("update user set money = ? where username=?;", 1, "zhangsan");accountService.handle1();}
}

如果 handle2 方法本身是有事務的,則 handle1 方法就會加入到 handle2 方法所在的事務中,這樣兩個方法將處于同一個事務中,一起成功或者一起失敗(不管是 handle2 還是 handle1 誰拋異常,都會導致整體回滾)。

如果 handle2 方法本身是沒有事務的,則 handle1 方法就會自己開啟一個新的事務。

? 2、REQUIRES_NEW
? REQUIRES_NEW 表示創建一個新的事務,如果當前存在事務,則把當前事務掛起。換言之,不管外部方法是否有事務,REQUIRES_NEW 都會開啟自己的事務。

? 3、NESTED
? NESTED 表示如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于 TransactionDefinition.PROPAGATION_REQUIRED。

? 4、MANDATORY
? MANDATORY 表示如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

? 5、SUPPORTS
? NOT_SUPPORTED 表示以非事務方式運行,如果當前存在事務,則把當前事務掛起。

? 6、NOT_SUPPORTED
? NOT_SUPPORTED 表示以非事務方式運行,如果當前存在事務,則把當前事務掛起。

? 7、NEVER
? NEVER 表示以非事務方式運行,如果當前存在事務,則拋出異常。

spring事務的實現原理

? 底層是通過aop進行實現,@Transactional注解使用環繞通知,在進入方法前開啟事務 。使用try catch包含目標方法,執行目標方法,執行完成后如果沒有拋出異常,就提交事務。如果拋出異常就進行回滾

代碼實現:

定義注解:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface rkTransactional {
}

切面:

@Aspect
@Component
@Slf4j
public class ExtrkThreadAop {@Autowiredprivate RkTransaction rkTransaction;/*** 只要方法上有加上rkTransactional 走around()* 異常通知* @param joinPoint* @throws Throwable*/@Around(value = "@annotation(com.rk.aop.rkTransactional)")public Object around(ProceedingJoinPoint joinPoint) {// 在目標方法之前開啟事務  底層實現:將事務狀態保存在當前線程里面TransactionStatus transactionStatus = rkTransaction.begin();try {Object result = joinPoint.proceed();//目標方法log.info("目標方法之后執行");//提交事務rkTransaction.commit(transactionStatus);return result;} catch (Throwable throwable) {// 目標方法執行向外拋出異常之后 手動回滾rkTransaction.rollback(transactionStatus);return "fail";}}
}

注解類:

@Component
public class RkTransaction {@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;// 開啟事務public TransactionStatus begin() {TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transaction;}// 提交事務public void commit(TransactionStatus transactionStatus) {dataSourceTransactionManager.commit(transactionStatus);}// 回滾事務public void rollback(TransactionStatus transactionStatus) {dataSourceTransactionManager.rollback(transactionStatus);}
}

test: 測試

    /*** 使用事務注解 事務到底在什么時候提交呢?該方法沒有拋出異常的情況下就會自動提交事務* aop* @param name* @return*/@GetMapping("/insertUser")@rkTransactionalpublic String insertUser(String name) {int result = userMapper.insertUser(name);if ("rk".equals(name)) {int j = 1 / 0;}return result > 0 ? "ok" : "fail";}
}

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

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

相關文章

發布本地(sap hana)Jar包到Maven私有倉庫

在控制臺執行如下命令: mvn deploy:deploy-file -DgroupId"com.sap.cloud.db.jdbc" -DartifactId"ngdbc" -Dversion"2.0.13" -Dpackaging"jar" -Dfile"F:\sap_ngdbc\ngdbc-2.0.13.jar" -DrepositoryId"rel…

Co-DETR:DETRs與協同混分配訓練論文學習筆記

論文地址:https://arxiv.org/pdf/2211.12860.pdf 代碼地址: GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training 摘要 作者提出了一種新的協同混合任務訓練方案,即Co-DETR,以從多種標…

網站會遭受那些攻擊,要怎么應對

隨著互聯網的普及和發展,很多企業或個人都建立了自己的網站,這些網站不僅可以展示企業或個人的信息,還可以提供各種服務和交流平臺。但是,在運營網站的過程中,很多人都會遇到網站被流量攻擊的情況,這種情況…

gmapping仿真

文章目錄 獲取源碼安裝依賴項編譯簡單場景運行gmapping開啟鍵盤控制通過launch文件來啟動gmappingGmapping建圖的參數設置地圖的保存和加載參考 獲取源碼 cd ~/catkin_ws/src/ git clone https://gitcode.com/weixin_42990464/wpr_simulation.git git clone https://gitcode.c…

【開源】基于Vue.js的農村物流配送系統的設計和實現

項目編號: S 024 ,文末獲取源碼。 \color{red}{項目編號:S024,文末獲取源碼。} 項目編號:S024,文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統登錄、注冊界面2.2 系統功能2.2…

java使用poi框架導出excel文件名命名為中文的方法

最近使用poi框架實現自動化報表導入導出功能,但是遇到一個問題,導出的表格命名為中文時不被識別,直接會以接口名為文件名導出,那么如何解決這個問題呢? 三行代碼解決: String fileName "xxxx統計表-…

小程序:用戶查找英語單詞的意思 ← Python字典

【程序分析】 ● 字典中的條目是沒有順序的。 ● 可以對字典使用如下方法: keys()、values()、 items()、 clear()、 get(key)、 pop(key) 和popitem()【程序代碼】 dictionary{"dog":"狗","apple":"蘋果","banana&q…

Java字節碼指令集概述及分類詳解

Java全能學習面試指南:https://javaxiaobear.cn 1、字節碼指令集與解析概述 Java字節碼對于虛擬機,就好像匯編語言對于計算機,屬于基本執行指令。 Java 虛擬機的指令由一個字節長度的、代表著某種特定操作含義的數字(稱為操作碼&a…

醫院供暖換熱站遠程監控案例

醫院供暖換熱站遠程監控案例 本文針對醫院換熱站遠程監控系統存在的問題,提出了一種基于物聯網技術的解決方案。通過使用云平臺功能,實現對換熱站設備的遠程監控和管理,提高系統運行效率,降低運維成本。 一.痛點 1、…

C語言——深入理解指針(1)

目錄 1.內存與地址 1.1 什么是內存 1.2 編址 2. 指針的變量和地址 2.1 取地址(&) 2.2 指針變量 2.3 解引用 2.4 指針變量大小 3. 指針變量類型存在的意義 3.1 不同類型指針的解引用 3.2 指針對整數的運算(,-&#…

(10)ATF MMU轉換表

MMU簡介 MMU(內存管理單元)負責將軟件使用的虛擬地址轉換為內存系統中使用的物理地址。MMU包括兩個模塊:TLB(Translation Lookaside Buffer)和TWU(Table Walk Unit)。TLB緩存最近使用的轉換&am…

Spring Beans;Spring Bean的生命周期;spring Bean的作用域,spring處理線程并發問題

文章目錄 Spring Beans請解釋Spring Bean的生命周期解釋Spring支持的幾種bean的作用域Spring容器中的bean可以分為5個范圍: Spring如何處理線程并發問題? 在現在的項目開發中經常使用到spring bean,那么來談談spring bean的生命周期&#xff…

APP軟件線上排查方法

在線上環境中排查APP軟件的問題是一項關鍵任務,需要使用一系列方法和工具來識別、定位和解決問題。以下是一些建議的排查方法,希望對大家有所幫助。北京木奇移動技術有限公司,專業的軟件外包開發公司,歡迎交流合作。 1.監控和日志…

linux如何查看文件的hash數值

在Linux系統中,你可以使用各種工具來查看文件的哈希值。下面是一些常見的方法: md5sum命令: md5sum 文件名例如: md5sum example.txtsha1sum命令: sha1sum 文件名例如: sha1sum example.txtsha256sum命令&a…

SQLServer的常用數據類型

常用數據類型 關于數據類型大家可能并不陌生,因為我們在C#中學了常用的數據類型,在數據庫中其實也差不多,大部分都有對應關系的,只是關鍵字上有差別,接下來我們講一下,請大家記住常用的就行。 第一、文本…

代碼規范有用嗎?聽聽100W年薪谷歌大佬怎么說!

谷歌內部的 python 代碼規范 熟悉 python 一般都會努力遵循 pep8 規范,也會有一些公司制定內部的代碼規范。大公司制定規范的目的不是說你一定要怎樣去使用編程語言,而是讓大家遵守同一套規則,節省其他人閱讀代碼的成本,方便協作…

紅酒按照糖含量怎么分類?

我們常聽人們形容葡萄酒為干型或甜型,這指的是葡萄酒的含糖量。不含糖就是干型,含糖少就是半干型,含糖多就是甜型,這是葡萄酒分類的一種——按糖量分。云倉酒莊的品牌雷盛紅酒分享一般分為干型、半干型、半甜型、甜型四種。 云倉…

get data from Nacos error,dataId:服務名

2023-11-23 09:44:35.595 ERROR 169 — [ main] c.a.n.client.config.impl.ClientWorker : [fixed-100.66.12.65_8848] [sub-server-error] no right, dataIdcampaign-task-service, groupcampaign, tenant 2023-11-23 09:44:35.598 ERROR 169 — [ main] c.a.c.n.c.NacosPrope…

Jetson orin(Ubuntu20.04)不接顯示器無法輸出VNC圖像解決辦法以及vnc安裝記錄

sudo apt install vino 好像Jetpack 5.0中已經自帶了。。 配置VNC server: gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 編輯org.gnome,增加一個“enabled key”的參數: cd /usr/share/glib-2…

氮化鎵的晶體學濕式化學蝕刻法

引言 目前,大多數III族氮化物的加工都是通過干法等離子體蝕刻完成的。干法蝕刻有幾個缺點,包括產生離子誘導損傷和難以獲得激光器所需的光滑蝕刻側壁。干法蝕刻產生的側壁典型均方根(rms)粗糙度約為50納米,雖然已經發現KOH基溶液可以蝕刻AlN…