spring 事务详解

spring 事务有两种 注解型事务和编程式事务。

事务不生效

1.同一个Service中的方法调用(编程式事务无此问题)

根源: 直接调用了 this 对象的方法,无法通过Spring动态代理,所以相应的方法无事务支持。
解决方案 新加一个Service 因为spring事务是介于Service层之间的,ServiceA中的A方法调用ServiceB中的B方法,这样才能让事务生效。

2. 多线程调用

解决方案 不要在一个事物中使用多线程,也就是说 指令操作要在同一个数据库连接和一个主线程基础上

3. 未被spring管理(类未加@Service注解)

解决方案 加上@Service注解注解

4. 数据库表不支持事务

解决方案 选择合适的数据库表以支持事务

5. 项目未开启事务(springboot 项目 默认开启事务)
6. 出现的异常被java代码捕获到了,而没有被事务获取到异常

注解型事务 @Transactional (简单的场景可以使用)

在Spring中对于事务的传播行为定义了七种类型分别是:

REQUIRED(默认) 如果当前有事务,则加入,没有事务,则新建事务。
SUPPORTS 如果当前有事务,则加入,没有事务,则以非事务的方式执行。
MANDATORY 如果当前有事务,则加入,没有事务则抛出异常
REQUIRES_NEW 新建一个事务,如果当前有事务则挂起当前事务
NOT_SUPPORTED 以非事务的方式执行指令 如果当前有事务,则挂起事务
NEVER 以非事务的方式执行指令 如果当前有事务,则抛出异常。
NESTED 如果当前有事务则新建一个子事务加入当前事务(父事务),没有事务则新建事务

(重要)REQUIRED(Spring默认的事务传播类型)

如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务

serviceA中
@Transactional(propagation = Propagation.REQUIRED)
public void testMain(){
    A(a1);  //调用A入参a1  向A表插入数据
    service.testB();    //调用另外一个serviceB 的 testB方法
}

serviceB中
@Transactional(propagation = Propagation.REQUIRED)
public void testB(){
    B(b1);  //调用B入参b1 向B表插入数据
    throw Exception;     //发生异常抛出
    B(b2);  //调用B入参b2 向B表插入数据
}

此时 因为 testB() 发生异常 并且 事务类型为 required类型 是属于同一个事务的,即A表和B表都不会插入数据,同一事物发生异常则回滚。

如果去掉 serviceA中 的 @Transactional(propagation = Propagation.REQUIRED)
则是testB()方法具有事务性,发生异常后无任何数据插入,而testA() 无事务 A表中有数据插入

SUPPORTS

当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行

serviceA中
public void testMain(){
    A(a1);  //调用A入参a1  向A表插入数据
    service.testB();    //调用另外一个serviceB 的 testB方法
}

serviceB中
@Transactional(propagation = Propagation.SUPPORTS)
public void testB(){
    B(b1);  //调用B入参b1 向B表插入数据
    throw Exception;     //发生异常抛出
    B(b2);  //调用B入参b2 向B表插入数据
}

这种情况下,执行testMain的最终结果就是,a1,b1存入数据库,b2没有存入数据库。由于testMain没有声明事务,且testB的事务传播行为是SUPPORTS,所以执行testB时就是没有事务的(如果当前没有事务,就以非事务方法执行),则在testB抛出异常时也不会发生回滚,所以最终结果就是a1和b1存储成功,b2没有存储。

那么当我们在testMain上声明事务且使用REQUIRED传播方式的时候,这个时候执行testB就满足当前存在事务,则加入当前事务,在testB抛出异常时事务就会回滚,最终结果就是a1,b1和b2都不会存储到数据库。

编程式事务

建议直接使用编程式事务,这样写出来的代码可读性好,可扩展性强,可维护性高 粒度小 可控性强,耦合度比较高,但是一定要注意spring事务的失效场景 spring事务失效场景及解决办法
例子:

Service@Resource
private TransactionTemplate transactionTemplate;

// 在需要有事务支持的代码中 一般是写入和更新 直接编程式事务写代码 例如
transactionTemplate.execute((s)->{
    // 需要事务支持的代码块  插入和更新操作
   return Boolean.TRUE;
});

事务的隔离级别

  1. 读未提交 read uncommit 最低的隔离级别
  2. 读已提交 read commited
  3. 可重复读 read repeat
  4. 串行化 最高的隔离级别
  5. default 默认以数据库的隔离级别为准。(mysql 默认是 可重复读)

脏读幻读不可重复读详解

问题场景复现 : 一个大事务中间有多次查询数据的操作,另外一个小事务,在大事务读取数据过程中,也在操作这些数据,由此造成大事务读取出现了问题。

  1. 脏读 大事务读取到了小事务未提交的数据,并且使用了这一错误数据。
  2. 幻读 大事务多次读取的数据总量不一致。强调数据总量。
  3. 不可重复读 大事务多次读取的数据内容不一致 强调数据内容。

mysql 数据库 默认的事务隔离级别是可重复读,使用的是MVCC 解决不可重复读的问题。
具体 : 每一行数据都有一个version 在查询和修改数据的时候,都会对版本进行过滤,不符合的数据版本则不会被查询到。

  1. 多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重复。
  2. 读乐观并发控制(OCC)是一种用来解决写-写冲突的无锁并发控制,认为事务间争用没有那么多,所以先进行修改,在提交事务前,检查一下事务开始后,有没有新提交改变,如果没有就提交,如果有就放弃并重试。乐观并发控制类似自选锁。乐观并发控制适用于低数据争用,写冲突比较少的环境。

参考 spring 事务传播机制详解
spring事务失效场景及解决办法
spring事务实现原理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语 大模型(学习笔记-9)大模型微调的相关概念 预训练 与 微调 全量微调FFT 与 PEFT的区别

目录 一、什么是大模型微调 二、指令微调 三、微调的目的 三、微调的方式 四、微调的步骤 五、微调数据准备 六、微调的数据质量 一、什么是大模型微调 预训练和微调的区别,这个很关键 二、指令微调 这个地方主要是微调的角度不同,简单理解&#…

linux jmeter ant下载并安装【2024-亲测】

环境 centos7 一、下载jmeter 在这里插入代码片wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz --no-check-certificate解压 tar -zxvf apache-jmeter-5.6.3.tgz复制到安装目录、设置环境变量 vim /etc/profile添加环境变量,路径改成…

YOLOv8: 快速而准确的对象检测

YOLOv8: 快速而准确的对象检测 背景 对象检测是计算机视觉中的一个关键任务,它可以帮助我们在图像或视频中识别和定位感兴趣的物体。其中,YOLO(You Only Look Once)系列是一类非常出色的实时对象检测算法,以其快速和准确的特点而闻名。YOLOv8是YOLO系列的最新版本,由Ultralyti…

【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能

此篇文档记录通过 Flash 下载工具 完成 Flash 加密 功能的实现,此文档不启用 Flash 加密方案的 NVS 加密。 Flash 加密启动的验证代码:esp-idf/components/bootloader_support/src/flash_encrypt.c Flash 加密测试例程:esp-idf/examples/sec…

【yolov8目标检测部署】TensorRT int8量化

原作者github:https://github.com/xuanandsix/Tensorrt-int8-quantization-pipline/tree/main 改进: 源代码支持的TensorRT版本为7.许多属性已经弃用; 在原有的代码上将支持的TensorRT版本从7改到8. !!不知道如何安装T…

酷得电子机器狗玩具 MCU方案介绍

机器狗是一种多功能、互动性强的机器人,适合家庭和学校环境。它不仅可以陪伴孩子们玩耍,还能帮助他们学习和成长。功能如下: 关节可动:机器狗的关节设计灵活,可以执行各种动作,如“坐下”、“俯卧撑”、“…

【Ant-Desgin-React 步骤条】步骤条配合组件使用

步骤条配合组件使用 基础使用多分组进度 基础使用 /* eslint-disable no-unused-vars */ import React, { useState } from react import { Button, message, Steps, theme } from antd import After from ./components/after import Now from ./components/now const steps …

纯js对比excel小工具

如何使用JavaScript和xlsx.js实现Excel文件对比:实战指南 在日常办公或数据分析工作中,我们经常需要比较两个Excel文件中的数据差异。手动对比不仅耗时费力,还容易出错。本文将带你通过一个简单的网页应用,利用JavaScript和开源库…

【产品经理】如果人人都是产品经理,那么如何提升自己的不可替代性?

任何职业都需要有危机感,不只是产品经理。 人有生老病死,相应的职场上也有升降变离。当乔布斯站在宇宙之巅望着芸芸众生说“活着就是为了改变世界”的时候,这话着实燃烧了我们一把。随之,马化腾、周鸿祎、张小龙、王小川等汹涌而入…

前端canvas项目实战——在线图文编辑器(九):逻辑画布

目录 前言一、 效果展示二、 实现步骤1. 调整布局,最大化利用屏幕空间2. 添加逻辑画布3. 添加遮罩4. 居中显示逻辑画布5. 一个容易被忽视的bug点 三、Show u the code后记 前言 上一篇博文中,我们实现了一组通用的功能按钮:复制、删除、锁定…

Eclipse内存分析器 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

1.visualvm实时监测 2.Memory Analyzer Tool打开 3.工具的使用可以参考 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 ------------------------ 1.我远程发现是其中一个客户端A请求服务器页面响应,一直得不到响应,然后客户端A一直请求&am…

js 字符串 第一个斜杠前最后一次出现英文字母的位置并添加自定义值,返回新值

要找到字符串中第一个斜杠(/)前最后一次英文字母出现的位置,可以使用正则表达式配合lastIndexOf方法。以下是实现这一功能的示例代码: 如果是匹配第一个数字前的字母加值可以看这里 function findLastLetterIndexBeforeSlash(str…

外贸旺季外贸人如何做好时间管理

第1步 记住这些原则 50-30-20原则 你工作日里50%的时间应该花在有益于你长期发展目标的事情上,30%的时间应该用于你完成中期(两年左右)目标的事情,20%的时间用于完成未来90天以内需要完成的任务。 “一个篮子”原则 One Bucket 尽可能减少自己接收新任务…

《QT实用小工具·四十六》多边形窗口

1、概述 源码放在文章末尾 该项目实现了可以移动的多边形窗口&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "polygonwindow.h"#include <QBitmap> #include <QQuickItem> #include <QQmlFile> #in…

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

第8章 软件工程

一、软件工程概述 &#xff08;一&#xff09;软件危机 1、含义&#xff1a;落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 2、解决方案&#xff1a;引入软件工程的思想。 &#xff08;二&#x…

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理 目录 Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理 一、简单介绍 二、问题现象 三、问题分析 四、使用空后处理&#xff0c;解决闪屏花屏的显示问题 五、空后处理完整代码 一、简单介绍 Unity 在…

国密SSL证书在等保、关保、密评合规建设中的应用

在等保、关保、密评等合规建设中&#xff0c;网络和通信安全方面的建设是非常重要的部分&#xff0c;需要实现加密保护和安全认证&#xff0c;确保传输数据机密性、完整性以及通信主体可信认证。国密SSL证书应用于等保、关保和密评合规建设中&#xff0c;不仅能够提升网络信息系…

API接口调用失败的常见原因?如何进行排查和处理?

API接口调用失败的常见原因有以下几种&#xff1a; 1. 无效的请求参数&#xff1a;可能是由于请求参数缺失、格式错误或者不符合接口要求导致的。解决方法是检查请求参数是否正确&#xff0c;并确保按照接口文档提供正确的参数。 2. 接口权限不足&#xff1a;有些接口需要特定…

JAVA自定义日期选择器

下载jar地址&#xff0c; https://toedter.com/jcalendar/ jar包下载地址 依赖包如下图所示&#xff1a; 整个项目代码已经上传到CSDN https://download.csdn.net/download/qq_30273575/89241601?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9kb3dubG9hZC9tYW5hZ2UvZG93bmxvYWQ…
最新文章