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.mzph.cn/news/775783.shtml

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

相关文章

STM32常用的开发工具有哪些

大家好,今天给大家介绍STM32常用的开发工具有哪些,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 STM32常用的开发工具主要包括以下几类: 集成开发环境&…

java数据结构与算法刷题-----LeetCode744. 寻找比目标字母大的最小字母

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 二分查找 二分查找 解题思路:时间复杂度O( l o g 2 …

说说webpack proxy工作原理?为什么能解决跨域?

文章目录 一、是什么二、工作原理三、跨域参考文献 一、是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要…

电路仿真软件大比拼:哪款更适合你?

以下是关于市面上常见的四款电路仿真软件的整体介绍: 1. Multisim(美国,美国国家仪器(NI)有限公司) 特点与优势: 直观的图形界面:提供用户友好的界面,便于快速搭建和修…

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展,绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大,电竞游戏直播、游戏教程短视频也备受人们喜爱,自然,像游戏陪练、代练行业也随之生长起来,本文就来讲讲,从软件开发角…

【字节二面】SpringBoot可以同时处理多少请求

目录 一、示例代码二、那么springboot可以处理多少请求?三、maxConnections、maxThreads、acceptCount的关系 一、示例代码 RestController Slf4j public class RequestController {GetMapping("/test")public String test(HttpServletRequest request) …

腾讯放大招了!AniPortrait开源上线!音频驱动逼真人像动画合成!人人都是歌手!

文章链接:https://arxiv.org/pdf/2403.17694 github链接:https://github.com/Zejun-Yang/AniPortrait 本文提出了AniPortrait,一个新颖的框架,用于生成由音频和参考肖像驱动的高质量动画。方法分为两个阶段。首先,从音…

linux i2c-tools使用总结

1,安装iic-tools sudo apt install i2c-tools -y 2,查看有几条iic总线 [root@sino-platform:/root]# ls /dev/i2c- i2c-0 i2c-1 i2c-2 i2c-3 3,查看i2c命令 [root@sino-platform:/root]# i2c i2cdetect i2cdump i2cget i2cset 4,iic-help命令 [root@sino-platform…

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”,组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…

Go语言介绍以及如何在Go语言中操作MySQL数据库

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

uniApp使用XR-Frame创建3D场景(6)播放模型动画

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解播放模型动画 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec6}}"><xr-light type"ambient&qu…

【Qt学习】了解Qt文件系统 + 利用QFile类实现记事本功能

文章目录 1. 前言 - 关于Qt文件1.1 QIODevice 介绍1.2 QFile 介绍1.2 打开文件的方式 2. 实例 - 记事本功能2.1 功能实现2.2 getOpenFileName() 与 getSaveFileName() 的区别2.3 效果演示 3. 资源文件 1. 前言 - 关于Qt文件 文件操作 是应⽤程序必不可少的部分&#xff0c;Qt作…

android 消息提醒

1.创建 MyBackgroundService.java 继承 Service public class MyBackgroundService extends Service {Overridepublic void onCreate() {super.onCreate();Log.i("业务服务", "开起业务服务");//调用服务后在页面手机上创建一个通知消息。if (android.os…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升&#xff0c;预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前&#xff0c;让我们先了解一下什么叫HUD。 HUD&#xff08;Head Up Display&#xff09;中文叫抬头显示系统&#xff0c;又被叫做平行显示系统。早被应用在飞机辅助…

vue基础——java程序员版(总集)

前言&#xff1a; ​ 这是一个java程序员的vue学习记录。 ​ vue是前端的主流框架&#xff0c;按照如今的就业形式作为后端开发的java程序员也是要有所了解的&#xff0c;下面是本人的vue学习记录&#xff0c;包括vue2的基本使用以及引入element-ui&#xff0c;使用的开发工具…

Github 2024-03-28 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Jupyter Notebook项目2TypeScript项目2非开发语言项目2Solidity项目1Go项目1Open Interpreter: 本地代码运行和自然语言界面 创建周…

大型驱动水冷负载电阻、缓冲器、滤波器和快速放电电阻

EAK业界首创双面水冷负载电阻器&#xff0c;独特的设计&#xff0c;用户更方便的串联并联使用&#xff0c;强大的水流带走更多因充放电带来的热量。AlN高可靠性氮化铝基板保证了热膨胀不会影响电阻的工作。 液冷电阻器使用水或离子水作为冷却剂。通过添加乙二醇&#xff0c;可以…

如何高效阅读嵌入式代码

大家好&#xff0c;今天给大家介绍如何高效阅读嵌入式代码&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 高效阅读嵌入式代码需要一些技巧和实践经验。以下是一些建议&#xff…