Spring事务 和 事务传播机制

        这里的 事务 和之前 MySQL的事务 一样,都是表示将⼀组操作封装成⼀个执⾏单元(封装到⼀起),要么全部成功,要么全部失败。

Spring 中事务的实现

1. 编程式事务(手动档)。

package com.example.transactiondemo.controller;

import com.example.transactiondemo.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    // 编程式事务
    @Autowired
    private DataSourceTransactionManager transactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;

    @RequestMapping("/del")
    public int del(Integer id) {
        if (id == null || id <= 0) return 0;
        // 1.开启事务
        TransactionStatus transactionStatus = null;
        int result = 0;
        try {
            transactionStatus = transactionManager.getTransaction(transactionDefinition);
            // 业务操作,删除用户
            result = userService.del(id);
            System.out.println("删除操作影响了:" + result + " 行");
            // 2. 提交事务/回滚事务
            transactionManager.commit(transactionStatus); // 提交事务
        } catch (Exception e) {
            if (transactionStatus != null) {
                transactionManager.rollback(transactionStatus); // 出现异常,回滚事务
            }
        }
        return result;
    }

}

运行结果:

2. 声明式事务(自动挡)。

package com.example.transactiondemo.controller;

import com.example.transactiondemo.Service.UserService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user2")
public class UserController2 {

    @Autowired
    private UserService userService;

    @RequestMapping("del")
    @Transactional  // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务
    public int del(@Param("id") Integer id) {
        if (id == null || id <= 0) {
            return 0;
        }
        int result = userService.del(id);
        System.out.println("删除操作影响了:" + result + " 行");
        return result;
    }

}

没有发生异常的情况下的运行结果:

1. 发生了异常情况下的运行结果(发生了回滚):

2. 但是这种代码的书写会导致程序直接异常而不能进行下一步了,为了更好解决这一问题就需要使用 try-catch 把错误代码包裹住:

        第 1 种是将异常抛出去,然后 spring 感知到了就自动帮我们实现回滚了,第 2 种是自己手动处理,因为 spring 会认为我们既然都用了 try-catch 了,那么就是知道会有异常发生了,从而不会帮我们自动实现回滚。

关于 @Transactional 

单元测试里:只要执行完都会进行回滚

普通类里:只有出现异常了才会进行回滚

参数的设置:

工作原理

通过切面,通过动态代理实现:

        @Transactional 是基于 AOP 实现的,AOP ⼜是使⽤动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果⽬标对象没有实现了接⼝,会使用 CGLIB 动态代理。
        @Transactional 在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到的异常,则回滚事务。

设置事务隔离级别

        Isolation.DEFAULT 是 spring 自己的,表示以连接的数据库的事务隔离级别为主。(Oracle 的默认隔离级别是 读已提交)
MySQL 事务隔离级别有 4 种:(默认的是 可重复读)

        ● 脏读:⼀个事务读取到了另⼀个事务修改的数据之后,后⼀个事务⼜进⾏了回滚操作,从⽽导致第⼀个事务读取的数据是错误的。
        ● 不可重复读:⼀个事务两次查询得到的结果不同,因为在两次查询中间,有另⼀个事务把数据修改了。
        ● 幻读:⼀个事务两次查询中得到的结果集不同,因为在两次查询中另⼀个事务有新增了⼀部分数据。

关于 spring boot 中事务会失效的情况

1.非public修饰的方法

2.timeout超时:当在 @Transactional 上,设置了一个较小的超时时间时,如果方法本身的执行时间超过了设置的 timeout 超时时间,那么就会导致本来应该正常插入数据的方法执行失败

3. 代码中有try/catch,也没进行手动回滚操作

4.当前数据库本身不支持事务

Spring 的传播机制

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

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

相关文章

Java线程池基本概念

全局和局部线程池 全局线程池 在Spring框架中&#xff0c;全局线程池如ThreadPoolTaskExecutor通常是作为Spring Bean存在的&#xff0c;它们的生命周期由Spring容器管理。当Spring容器关闭时&#xff0c;这些线程池也会被适当地清理和关闭。因此&#xff0c;开发者通常不需要手…

MCK主机加固在防漏扫中的关键作用

在当今这个信息化飞速发展的时代&#xff0c;网络安全成为了企业不可忽视的重要议题。漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种旨在发现计算机系统、网络或应用程序中潜在安全漏洞的技术手段。通过自动化工具&#xff0c;漏扫能够识别出系统中存在的已知漏洞&#xff0…

调度算法-进程调度算法

发⽣ CPU 调度通常有以下情况&#xff1a; 1. 当进程从运⾏状态转到等待状态&#xff1b;2. 当进程从运⾏状态转到就绪状态&#xff1b;3. 当进程从等待状态转到就绪状态&#xff1b;4. 当进程从运⾏状态转到终⽌状态 常⻅的调度算法&#xff1a; 先来先服务调度算法最短作业…

Airtest初使用

https://airtest.doc.io.netease.com/tutorial/2_Airtest_introduction/ 什么是Airtest Airtest是一款基于Python语言、跨平台的UI自动化测试框架&#xff0c;基于图像识别原理&#xff0c;比较适用于游戏和App。 它的主要特点包括&#xff1a; 跨平台支持&#xff1a;支持A…

打造精致UI界面:字体设计的妙招

字体设计是UI设计的关键模块之一。字体设计是否有效可能直接实现或破坏整个UI界面。那么&#xff0c;界面设计的字体设计有哪些规范呢&#xff1f;如何设计细节字体&#xff1f;本文将解释字体设计规范的可读性、可读性和可用性&#xff0c;并介绍UI界面中的字体设计技巧。 如…

团队管理的三个要点,打造高执行力团队

一、明确目标与责任 明确的目标与责任是团队高效运作的基石。只有当团队成员对目标有清晰的认识&#xff0c;并明确自己的责任时&#xff0c;才能形成强大的合力&#xff0c;推动团队不断前进。 1、目标设定 目标应该具体、可衡量、有挑战性但可实现。项目经理可以与团队成员…

Nginx Proxy 代理测试

目录 https://blog.csdn.net/Lzcsfg/article/details/139781909 一. 实验准备 二. 配置反向代理 三. 配置二层代理 解释流程 一. 实验准备 关闭防火墙和selinux&#xff0c;准备三台同一网段的虚拟机 localhostRoucky_linux9.4192.168.226.20localhostRoucky_linux9.419…

【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 26页及31页2篇完整论文及Python 代码实现

【2024泰迪杯】C 题&#xff1a;竞赛论文的辅助自动评阅 26页及31页完整论文及Python 代码实现 相关链接 【2024泰迪杯】A 题&#xff1a;生产线的故障自动识别与人员配置 Python代码实现 【2024泰迪杯】B 题&#xff1a;基于多模态特征融合的图像文本检索Python代码实现 【2…

基于PHP的草莓种植信息管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的草莓种植管理系统 一 介绍 此草莓种植管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端采用jquery.js和kindeditor在线HTML编辑器。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqljquery.jsphpstudyvsco…

云计算【第一阶段(16)】安装及管理程序

一、linux 应用程序基础 当我们主机安装linux操作系统 时候&#xff0c;也会同时安装一些软件或网络服务等等&#xff0c;但是随着系统一起安装的软件包毕竟他是少数的&#xff0c; 能够实现的功能也是有限的&#xff0c;那么我们相拥为主机提供更多更丰富的功能的时候&#x…

注意力机制和Transformer模型各部分功能解释

文章目录 Transformer1、各部分功能解释2、通过例子解释a.输入预处理位置编码b.Encoder 的处理c.Decoder的输入Decoder的工作流程d.输出预测总结 Attention代码和原理理解 Transformer 运行机理&#xff1a; &#xff08;1&#xff09;假设我们需要进行文本生成任务。我们将已…

Java17 --- redis7缓存双写一致性

一、缓存双写一致性 如果redis中有数据&#xff1a;需要和数据库中的值相同。如果redis中没有数据&#xff1a;数据库中的值要是最新值&#xff0c;且准备回写redis。只读缓存。读写缓存&#xff1a;①、同步直写策略&#xff1a;写数据库后也同步写redis缓存&#xff0c;缓存…

计算机网络(谢希仁第六版)| 课后习题与答案 | 物理层 | 题目知识点详细分析

计算机网络&#xff08;谢希仁第六版&#xff09;课后习题与答案 物理层 博客只对老师给的重点进行整理&#xff0c;完整的课后习题答案见Gitee下载&#xff1a;《计算机网络教程&#xff08;第6版&#xff09;&#xff08;微课版&#xff09;》习题答案 2-5 请画出数据流1 0 1…

Java基础学习-流程控制语句-顺序结构-分支结构-循环结构

目录 顺序结构&#xff1a; 分支结构&#xff1a; if语句&#xff1a; 第一种格式&#xff1a; if第二种格式&#xff1a; 案例练习 if第三种格式&#xff1a; switch语句&#xff1a; 格式&#xff1a; switch其他知识点&#xff1a; 循环结构&#xff1a; for循环…

软件测试面试题:性能测试关注哪些指标?

问题 在工作中&#xff0c;使用JMeter做压力测试时&#xff0c;需要关注其中的哪些指标&#xff1f; 性能测试关注哪些指标&#xff1f; 考察点 面试官想了解&#xff1a; 是否用过 JMeter 指标进行分析 技术点 涉及的技术点&#xff1a; JMeter 结果分析 回答 性能指…

基于 Vitis HLS 的单个乘法 DSP 映射研究

文章目录 1 自媒体账号2 引言3 整数乘法4 定点乘法5 浮点乘法6 总结 1 自媒体账号 目前运营的自媒体账号如下&#xff1a; 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com 如果觉得有所收获的话&#xff0c;可以点击我的主页 -> 充电 -> 自定义充电 支持一下&#…

2024加密软件排行榜|最新企业常用加密软件推荐

安秉网盾加密软件&#xff1a; 专注于企业级的透明加密解决方案&#xff0c;确保公司内部文件在公司环境外无法被访问。 审批机制灵活&#xff0c;支持多种审批方式&#xff0c;方便管理。 广泛应用于多个行业&#xff0c;拥有丰富的企业环境适配经验。 适合对内部数据安全有严…

设置角色运动的动画

(1) 打开Assets-UnityTechnologies-Animation-Animators&#xff0c;Create-Animation-Controller,命名为JohnLemon (2) 打开JohnLemon&#xff0c;出现下图 (3) 依次将Assets-UnityTechnologies-Animation-Animation中的JohnIdle和JohnWalk拖放到Base Layer窗口中 (4) 右击Idl…

分享由AI制定一个商城网站的开发计划及推荐的开发语言

商城网站开发计划 一、项目概述 本商城网站开发计划旨在创建一个功能齐全、用户友好的在线购物平台&#xff0c;为顾客提供商品浏览、搜索、购物车管理、订单跟踪、在线支付等服务。商城将支持多种商品分类&#xff0c;包括但不限于电子产品、家居用品、服饰鞋帽等。 二、开…

Nginx缓存之代理缓存配置

Nginx 的缓存功能是集成在代理模块中的&#xff0c;当启用缓存功能时&#xff0c;Nginx 将请求返回的响应数据持久化在服务器磁盘中&#xff0c;响应数据缓存的相关元数据、有效期及缓存内容等信息将被存储在定义的共享内存中。当收到客户端请求时&#xff0c;Nginx 会在共享内…