15. Spring事务管理

news2024/11/17 13:32:44

1. Spring事务简介

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败
  • Spring事务作用:在数据层或**业务层**保障一系列的数据库操作同成功同失败

2. 案例

2.1 需求和分析

  • 需求:实现任意两个账户间转账操作
  • 需求微缩:A账户减钱,B账户加钱
  • 分析:
    ①:数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)
    ②:业务层提供转账操作(transfer),调用减钱与加钱的操作
    ③:提供2个账号和操作金额执行转账操作
    ④:基于Spring整合MyBatis环境搭建上述操作
  • 结果分析:
    ①:程序正常执行时,账户金额A减B加,没有问题
    ②:程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败

2.2 【前置工作】环境准备

Spring整合Mybatis相关代码(依赖、JdbcConfig、MybatisConfig、SpringConfig)省略。

package com.zhang.dao;


import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

public interface AccountDao {


    @Update("update tb_account set money = money + #{money} where name = #{name}")
    void inMoney(@Param("name") String name, @Param("money") Double money);

    @Update("update tb_account set money = money - #{money} where name = #{name}")
    void outMoney(@Param("name") String name, @Param("money") Double money);
}
========================================================================================================
package com.zhang.service;


import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;

public interface AccountService {

    /**
     * 转账操作
     * @param out 传出方
     * @param in 转入方
     * @param money 金额
     */
    @Transactional
    public void transfer(String out,String in ,Double money);
}

=========================================================================================================
@Service
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;

    public void transfer(String out,String in ,Double money) {
        accountDao.outMoney(out,money);
        int i = 1/0;
        accountDao.inMoney(in,money);
    }
}

2.3 做spring事务步骤

2.3.1 在spring配置类上开启注解式事务驱动

image-20221221144840438

/**
 * spring配置类
 */
@Configuration
@ComponentScan("com.zhang")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement//开启注解式事务驱动
public class SpringConfig {
}

2.3.2 设置事务管理器(将事务管理器添加到IOC容器中)

说明:可以在JdbcConfig中配置事务管理器

    @Bean//配置事务管理器,mybatis使用的是jdbc事务
    public PlatformTransactionManager platformTransactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }

注意事项

  1. 事务管理器要根据实现技术进行选择
  2. MyBatis框架使用的是JDBC事务
2.3.3 在业务层接口上添加Spring事务管理
public interface AccountService {
    //配置当前接口方法具有事务
    @Transactional
    public void transfer(String out,String in ,Double money) ;
}

2.4 测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTest {

    @Autowired
    private AccountService accountService;

    @Test
    public void test() throws IOException {
        accountService.transfer("zhangsan", "李四", 50d);
    }
}

3. Spring事务角色

  • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
  • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

image-20221221214909743

4. Spring事务相关配置

说明:对于RuntimeException类型异常或者Error错误,Spring事务能够进行回滚操作。但是对于编译器异常,Spring事务是不进行回滚的,所以需要使用rollbackFor来设置要回滚的异常

4.1 事务配置

image-20221221215222016

5.4 事务传播行为

pring事务能够进行回滚操作。但是对于编译器异常,Spring事务是不进行回滚的,所以需要使用rollbackFor来设置要回滚的异常**

4.1 事务配置

[外链图片转存中…(img-yQ9l9ppy-1671631369109)]

5.4 事务传播行为

image-20221221215317653

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

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

相关文章

如何使用 SAP OData 服务向 ABAP 服务器上传文件试读版

本教程到目前为止开发的 OData 图书管理服务,可以在 ABAP 系统里对图书数据进行增删改查。 本步骤我们继续介绍如何通过 SAP OData 服务,实现向 ABAP 系统上传文件的需求。我们采取 Postman 进行文件上传。 先看一下通过本文介绍的步骤,实现…

word基础功能应用:带圈字符如此妙法,好玩有趣

很多人把Word当成码字的记事本,其实它的逆天操作,远比你想象得还要强大。比如,Word中的“带圈字符”功能。 01、基本用法 Word中,点击【开始】-【带圈字符】按钮,即可启用“带圈字符”功能。 比如,我们可…

自然语言处理学习笔记-lecture10-机器翻译01

机器翻译的产生与发展 机器翻译 (machine translation, MT) 是用计算机把一种语言(源语言, source language) 翻译成另一种语言(目标语言, target language) 的一门学科和技术。 机器翻译的困难如下: 自然语言中普遍存在的歧义和未知现象机器翻译不仅仅是字符串的…

Spring IOC和Bean生命周期以及源码分析

这篇文章主要讲解 IOC 容器的创建过程,让大家对整体有一个全局的认识,文章目录如图: 1. 基础知识 1.1 什么是 Spring IOC ? IOC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦…

springboot小区物业管理系统maven idea1562

本小区物业管理系统以springboot作为框架,以MySql作为后台运行的数据库,使用Tomcat用为系统的服务器,同时使用JSP显示业主界面。本系统主要包括以下功能模块:个人中心、业主管理、费用缴纳管理、疫情防控管理、小区车位管理、车位…

基于 Traefik 的 Basic Auth 配置

前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易。 Traefik可以与现有的多种基础设施组件(Docker、Swarm模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地配置自…

Allegro如何快速统计串阻前后端的长度操作指导

Allegro如何快速统计串阻前后端的长度操作指导 Allegro可以快捷的统计出串阻前后端的长度,并且归一到一个网络中,方便查看 比如需要统计1-3的总长 具体操作如下 选择Analyze-Model Assignment出现SI Design Audit窗口,直接点击ok<

CSS -- CSS3中3D转换相关属性讲解(translate3d,rotate3d,perspective,transform-style)

文章目录3D转换1 三维坐标系2 3D移动 translate3d3 透视 perspective4 3D 旋转 rotate3d5 3D旋转 rotate3d6 3D呈现 transform-style7 3D案例3D转换 我们生活的环境是3D的&#xff0c;照片就是3D物体在2D平面呈现的例子。 3D特点&#xff1a; 近大远小。物体后面遮挡不可见 …

[论文阅读] PointSeg: Real-Time Semantic Segmentation Based on 3D LiDAR Point Cloud

文章目录1. 主要思想2. 具体方法2.1 数据投影2.2 网络结构3. 实验支撑4. 总结启示5. 相关文献paper 原论文的链接 code: 源代码链接 67.4 (car) 19.2(ped) 32.7(cyclist)|90 fps/GPU 1. 主要思想 通过什么方式&#xff0c;解决了什么问题 在SqueezeSeg的基础上&#xff0c;利用…

小学生C++编程基础 课程8(A)

912.买水果 (课程8&#xff09; 登录 913.1或2 (课程8&#xff09; 登录 914.and和or &#xff08;课程8&#xff09; 难度&#xff1a;1 登录 915.在区间里 ( 课程8 ) 难度&#xff1a;1 登录 916.区间交集 ( 课程8 ) 难度&#xff1a;1 登录 917.区间并集 ( 课程8 ) 难度…

zabbix“专家坐诊”第178期问答汇总

大家好&#xff0c;我是乐乐。早在三年前&#xff0c;我们就在社区举办了zabbix公益问答活动&#xff0c;并且定在每周三邀请资深的zabbix技术工程师&#xff0c;为社群的小伙伴进行免费的答疑。到现在已经178期了。后续我将会把每期的答疑汇总分享在百家&#xff0c;供广大的z…

Qt——基本介绍、详解对象树

目录 一.基本介绍 二.对象树 一.基本介绍 创建qt项目是&#xff0c;如果选择空窗口QWidget&#xff0c;那么mian函数中会有如下代码&#xff1a; #include "myWindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, ar…

【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)

目录 一、现状背景 二、场景分析 1、配置 2、服务 三、长连接核心诉求 1、功能性诉求 1.1、客户端 1.2、服务端 2、性能 3、负载均衡 4、连接生命周期 4.1、心跳保活机制 4.2、需要什么 四、长连接选型对比 五、基于长链接的⼀致性模型 1.、配置⼀致性模型 1.…

Unity导出并制作window安装程序exe

前言 如果我们是做pc端游或者基于pc的一些应用的&#xff0c;那么我们肯定对打包exe应用程序不陌生&#xff0c;我们经常会用到一些软件&#xff0c;比如&#xff1a;inno setup&#xff0c;NSIS等 而使用unity做游戏开发的的人来说&#xff0c;一般导出程序都是面向手机的apk…

比亚迪艰难的国际化之路

来源:猛兽财经 作者&#xff1a;猛兽财经 比亚迪是如何在中国市场取得成功的&#xff1f; 在深入分析比亚迪&#xff08;01211&#xff09;的国际化之前&#xff0c;我们有必要先了解一下比亚迪是如何在国内市场取得成功的。为了说明这一点&#xff0c;猛兽财经将在接下来进行…

【评测】扩散流完整性测试原理

早在1997 年出台的21 CFR Part 11中&#xff0c;就对与药物产品审批放行相关的电子记录有规定&#xff0c;应采取与纸质记录相同的控制要求1&#xff0c;包括生成或维护电子记录须采用恰当的访问控制措施&#xff0c;记录变更必须体现在记录审计追踪中等。 2003年&#xff0c;…

深度理解go中的Map

这里写自定义目录标题前言map的内存模型增量扩容查找过程分析插入过程分析前言 本篇将从底层讲解map的赋值、删除、查询、扩容的具体执行过程。结合源码&#xff0c;让你彻底明白map的原理。 map的内存模型 在源码中&#xff0c;表示map的结构体是hmap&#xff0c;其定义如下…

红队隧道应用篇之Burpsuite设置上游代理访问内网(五)

为何要设置上层代理 Burp Suite设置上游代理的主要原因是为了拦截和修改来自浏览器的请求。当您在使用Burp Suite进行Web应用程序安全测试时&#xff0c;您可能希望模拟攻击者发送恶意请求&#xff0c;以测试应用程序是否能够防御这些攻击。使用上游代理可以帮助您在浏览器和目…

Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

python自定义包实例

了解python中的异常捕获与传递请点击“python中的异常捕获与传递” 了解python中的模块与包详解请点击“python中的模块与包详解” 目录 一.实例&#xff1a;自定义包 二.详解 1.新建my_utils包 2.新建str_util.py和file_util.py两个python file 3.str_util.py中的代码 演…