Spring 事务传播行为

实现原理 : Aop (TransactionInterceptor) 实现

使用spring声明式事务注意事项

同一个bean中的方法调用必须重新声明一个bean调用、否则后续方法调用的事务默认使用第一个第二个不生效

package com.cloud.person.service.impl;import com.cloud.person.dao.S1Mapper;
import com.cloud.person.service.S1Service;
import com.cloud.person.service.S2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;/*** @author haizhuangbu* @date 2024/3/27 09:58* @mark S1ServiceImpl*/
@Service
public class S1ServiceImpl implements S1Service {@Autowiredprivate S1Mapper s1Mapper;@Autowiredprivate S2Service s2Service;@Autowiredprivate S1Service s1Service;@Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);int i = 1 / 0;}@Transactional(propagation = Propagation.REQUIRES_NEW)@Overridepublic void insert2(String data) {s2Service.insert(data);}
}

REQUIRED

REQUIRED  存在事务、就加入事务、不存在就新建事务(默认)

模拟,当前情况 s2 依赖 s1 事务
    @Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);int i = 1 / 0;}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void insert2(String data) {s2Service.insert(data);}
处理结果 : s1,s2 两张表数据全部插入失败

REQUIRES_NEW

REQUIRES_NEW: 创建新事务与其他事务没有联系、成功就插入

模拟,当前情况 s2 为新事务、不依赖 s1.s1成功失败对s2 无任何影响
@Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);int i = 1 / 0;}@Transactional(propagation = Propagation.REQUIRES_NEW)@Overridepublic void insert2(String data) {s2Service.insert(data);}
处理结果: s2 插入成功、s1 插入失败


SUPPORTS

SUPPORTS : 支持当前事务、当前事务存在就加入、不存在就按照无事务执行

模拟 1 :  s1 存在事务、s2 依赖 s1 事务、全部插入失败
    @Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);int i = 1 / 0;}@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic void insert2(String data) {s2Service.insert(data);}
结果 1: 

模拟2: 模拟 s2 插入异常、s1无事务、s2 依赖 s1, s1没有事务、s2 就是无事务执行、异常不影响数据库操作、不会触发回滚
@Override
//    @Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);}@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic void insert2(String data) {s2Service.insert(data);int i = 1 / 0;}
结果:  无事务执行、s1,s2全部执行成功


MANDATORY

MANDATORY : 依赖其他事务、其他事务不存在就抛出异常

模拟: 
@Override
//    @Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);}@Transactional(propagation = Propagation.MANDATORY)@Overridepublic void insert2(String data) {s2Service.insert(data);
//        int i = 1 / 0;}
结果: 程序直接抛出异常、s1 不存在事务、s1数据成功插入


NOT_SUPPORTED 

NOT_SUPPORTED  如果存在事务、当前事务挂起、以非事务方式执行

模拟:  s1 存在事务、s2 通过非事务方式执行、s2 不受s1 影响
    @Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);int i = 1 / 0;}@Transactional(propagation = Propagation.NOT_SUPPORTED)@Overridepublic void insert2(String data) {s2Service.insert(data);}
结果:  s1 插入失败、s2 插入成功


NEVER

NEVER : 存在事务就抛出异常、对标 MANDATORY

模拟: s1 存在事务、s2 抛出异常
@Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);// 走不到这儿、前面抛出异常int i = 1 / 0;}@Transactional(propagation = Propagation.NEVER)@Overridepublic void insert2(String data) {s2Service.insert(data);}
结果: 抛出异常,s1,s2表插入失败


NESTED

NESTED :  嵌套事务、内部事务回滚、不影响外部事务、spring默认不支持

模拟: 

// 编程式事务@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate PlatformTransactionManager manager;@Override@Transactional(propagation = Propagation.REQUIRED)public void insert(String data) {s1Mapper.insert(data);// 调用s2 想要当前类的insert2事务生效必须重新注入当前bean 调用 insert2方法s1Service.insert2(data);
//        int i = 1 / 0;}@Transactional(propagation = Propagation.NESTED)@Overridepublic void insert2(String data) {s2Service.insert(data);// 回滚当前事务TransactionStatus transaction = manager.getTransaction(transactionDefinition);manager.rollback(transaction);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573763.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10怎么关闭自动更新,win10关闭自动更新步骤

不知道大家有没有碰到过这样的情况,就是有一位网友反映说最近买了一台新电脑,配置呢也很高,玩游戏呢也很流畅,不过有一件事情让他很头疼,就是这个电脑有的时候就会出现蓝屏,还提示修复什么的,并且呢越用越卡顿。出现这个问题的主要原因就是现在新的电脑一般用的都是win1…

CC1310F128RSMR Sub-1GHz超低功耗无线微控制器芯片

CC1310F128RSMR QFN-32 Sub-1GHz超低功耗无线微控制器 CC1310F128RSMR是一款低成本、 超低功耗、Sub-1 GHz射频器件,它是Simplel ink微控制器(MCU)平台的一部分。该平台由Wi- Fi组成、蓝牙低功耗,Sub-1 GHz,以太网,Zigbee线程和主…

数字身份的革命:解锁 Web3 的身份验证技术

引言 随着数字化时代的到来,个人身份认证成为了日常生活和商业活动中不可或缺的一部分。传统的身份验证方式存在着安全性低、易伪造、不便利等问题,因此,人们迫切需要一种更安全、更便捷的身份验证技术。在这样的背景下,Web3的身…

Redis常见命令

基础篇Redis 4.Redis常见命令 4.1 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便我们学习,将…

git提交-分支开发合并-控制台操作

git提交-分支开发合并-控制台操作 git的基本概念工作区、暂存区和版本库工作区:就是你在电脑里能看到的目录(隐藏目录 .git不算工作区)。暂存区:英文叫 stage 或 index。一般存放在本地的.git目录下的index 文件(.git/…

zedboard+AD9361 运行 open WiFi

先到github上下载img,网页链接如下: https://github.com/open-sdr/openwifi?tabreadme-ov-file 打开网页后下载 openwifi img 用win32 Disk lmager 把文件写入到SD卡中,这一步操作会把SD卡重新清空,注意保存数据。这个软件我会…

vue+Echarts实现多设备状态甘特图

目录 1.效果图 2.代码 3.注意事项 Apache ECharts ECharts官网,可在“快速上手”处查看详细安装方法 1.效果图 可鼠标滚轮图表和拉动下方蓝色的条条调节时间细节哦 (注:最后一个设备没有数据,所以不显示任何矩形)…

[BT]BUUCTF刷题第5天(3.23)

第5天(共3题) Web [GXYCTF2019]BabyUpload 先上传一句话木马,修改文件后缀名为php,但是返回页面提示后缀不能有ph 常用的后缀名绕过都带有ph,因此这道题采用上传.htaccess文件(上传时注意使用BP抓包将Con…

国内ip切换app,让切换ip变得简单

在数字化快速发展的今天,互联网已经成为我们生活中不可或缺的一部分。然而,随着网络应用的深入,用户对于网络环境的需求也日益多样化。其中,IP地址作为网络中的关键标识,其切换与管理显得尤为重要。为了满足用户对于IP…

Vue 生态最火的元框架(Nuxt 3.10)

在主流的 JS 库/框架生态中,近年来诞生了若干元框架,比如 React 的 Next 和 Remix,Vue 的 Nuxt 等。 不久前,Nuxt团队官宣 Nuxt 3.10 正式发布,截止今天已经发布3.11版本了,更新包含了若干功能和修复。其实…

阿里云企业邮箱API与其他API服务的不同点?

阿里云企业邮箱API如何使用?如何配置邮箱API权限? 在众多API服务中,阿里云企业邮箱API以其独特的功能和优势,为企业邮箱管理带来了全新的体验。那么,阿里云企业邮箱API与其他API服务究竟有哪些不同点呢?Ao…

SD卡备份和烧录ubuntu20.04镜像

设备及系统:nuc幻影峡谷工控机,ubuntu20.04,树莓派4B,SD卡读卡器 一、确定SD卡设备号的两种方法 方法1: 将有ubuntu镜像的SD卡插入读卡器,再将读卡器插入电脑主机,在 工具 中打开 磁盘&#…