Spring的第十四阶段:Spring的事务管理(01)

news2025/1/21 10:08:38

事务管理

事务分为声明式和编程式两种:

声明式事务:

声明式事务是指通过 注解的形式 或 xml配置的形式 对事务的各种特性进行控制和管理。

编码式(编程式)事务:

指的是通过编码的方式实现事务的声明。

1、编码方式实现事务:

在这里插入图片描述

2、声明式事务环境搭建

2.1、准备测试数据库

##创建tx数据库
drop database if exists `tx`;
CREATE database `tx`;
##切换tx数据库
USE `tx`;

##创建用户表
CREATE TABLE `user` (
  `id` int primary key auto_increment,	
  `username` varchar(50) NOT NULL,
  `money` int(11) DEFAULT NULL
);
##插入数据
insert  into `user`(`username`,`money`) values ('张三',1000),('李四',1000);

##创建图书表
create table `book`(
    `id` int primary key auto_increment,
    `name` varchar(500) not null,
    `stock` int
);
##插入数据
insert into book(`name`,`stock`) values('java编程思想',100),('C++编程思想',100);

##查看数据
select * from book;
select * from user;

2.2、创建一个Java工程,导入Jar包

在这里插入图片描述

导需要以下的jar包:

druid-1.1.9.jar
junit_4.12.jar
mysql-connector-java-5.1.37-bin.jar
org.hamcrest.core_1.3.0.jar
spring-aop-5.2.5.RELEASE.jar
spring-aspects-5.2.5.RELEASE.jar
spring-beans-5.2.5.RELEASE.jar
spring-context-5.2.5.RELEASE.jar
spring-core-5.2.5.RELEASE.jar
spring-expression-5.2.5.RELEASE.jar
spring-jcl-5.2.5.RELEASE.jar
spring-jdbc-5.2.5.RELEASE.jar
spring-orm-5.2.5.RELEASE.jar
spring-test-5.2.5.RELEASE.jar
spring-tx-5.2.5.RELEASE.jar
@Repository
public class UserDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void updateUser(){
        // 演示的主要内容是事务
        jdbcTemplate.update("update user set `username` = 'user用户表被修改了'");
    }

}

@Repository
public class BookDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void updateBook(){
        jdbcTemplate.update("update book set `name` = 'book图书表被修改了'");
    }

}

@Service
public class TransactionService {

    @Autowired
    private BookDao bookDao;

    @Autowired
    private UserDao userDao;

    public void multiUpdate(){
        bookDao.updateBook();
     
        userDao.updateUser();
    }

}

3、测试Service的默认事务

测试service服务层的默认事务

@Service
public class TransactionService {

    @Autowired
    private BookDao bookDao;

    @Autowired
    private UserDao userDao;

    public void multiUpdate(){
        bookDao.updateBook();
        int i = 12 / 0;
        userDao.updateUser();
    }

}

3.1、异常的演示

在这里插入图片描述

数据库中 图书表修改成功
在这里插入图片描述
用户表修改失败:
在这里插入图片描述

3.2、Spring事务引入的分析------PlatformTransactionManager类简单介绍

在Spring框架中,事务管理由一个接口 PlatformTransactionManager 来定义如何管理:
在这里插入图片描述

以下是PlatformTransactionManager实现类:
在这里插入图片描述

Spring底层事务管理原理解析:
在这里插入图片描述

4、使用Spring的注解声明事务管制

测试Spring的声明式事务

ApplicationContext.xml配置文件:

  <!-- 配置切面类 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--
            DataSourceTransactionManager中的数据源一定是操作数据库时使用的数据源
        -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--
        应用事务的代理
            transaction-manager="transactionManager" 配置事务管理器
            如果事务管理器的 id 值是 transactionManager 可以省略不配
      注解 @Transactional 和 tx:annotation-driven标签组合使用.
-->
    <tx:annotation-driven
            transaction-manager="transactionManager" />

在这里插入图片描述

5.noRollbackFor和noRollbackForClassName测试不回滚的异常

Spring的事务管理默认是对抛出的RunTimeException 运行时异常. 以及它的子异常进行自动的回滚操作.

noRollbackFor和noRollbackForClassName测试不回滚的异常

/**
 * @Transactional 表示使用通知( 启用事务 ) <br/>
 *
 * noRollbackFor 属性表示定义义哪些异常不在回滚事务 <br/>
 * noRollbackForClassName 属性需要指定不回滚的异常的全类名 <br/>
 */
@Transactional(noRollbackForClassName = "java.lang.ArithmeticException")
public void multiUpdate() throws Exception {
    bookDao.updateBook();
    int i = 12 / 0;
    userDao.updateUser();
}

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

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

相关文章

【2023/05/13】NP完备

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第8天。 Share I sit at my window this morning where the world like a passer-by stops for a moment,nods me and goes. 译文&#xff1a; 我今晨坐在窗前&#xff0c;世界如一个过路人似的&#x…

QT多线程(线程互斥)

文章目录 前言一、导致问题产生的原因和解决方法二、同时访问一个临界资源带来的问题三、QMutex线程锁4.线程死锁5.解决死锁的方法总结 前言 线程互斥是指在多线程并发执行时&#xff0c;为避免多个线程访问共享资源时发生冲突而采取的一种机制。本篇文章我们就这个问题来了解…

c++学习之mystring的简单封装

我们经常利用string类实例化对象来对字符串进行各种操作&#xff0c;string类是一个实用的类&#xff0c;那么对于string类的一些基本操作是如何实现的呢&#xff1f;我们简单的实现一下mystring的封装。 目录 1.常用的字符串函数 2.构造函数的创建 1.无参构造 2.有参构造…

Java面试知识点(全)- Java面试基础部分二

[Java面试知识点(全)(https://nanxiang.blog.csdn.net/article/details/130640392)&#xff1a; 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 TPS&QPS TPS&#xff1a;是Transactions PerSecond的缩写&#xff0…

elment-ui/plus不定高度容器收缩折叠动画组件

文章目录 学习链接效果代码 学习链接 原生js手动实现一个多级菜单效果&#xff08;高度可过渡变化&#xff09; - 自己的链接 vue实现折叠展开收缩动画 - 自己的链接 效果 代码 在使用element-plus的折叠组件的时候&#xff0c;一般用的是<el-collapse>组件&#xff0…

Vector - CAPL - CANoe硬件配置函数 - 04

目录 getChipType -- 确定当前所用的CAN控制器类型 代码示例 setCanCabsMode -- 设置 CANcab 模式 代码示例 setOcr -- 设置输出寄存器 代码示例 setBtr -- 设置位时序寄存器BTR 代码示例 getChipType -- 确定当前所用的CAN控制器类型 功能&#xff1a;确定所用 CAN 控制…

身边不动点定理的有意思应用

最近读高观点下的数学这本书&#xff0c;对书中介绍的布劳威尔不动点定理的有趣性质印象很深&#xff0c;原因是这个定理的某些性质能够解释我们生活中的一些常见现象&#xff0c;这里结合一个例题&#xff0c;聊以记录。 从一个数学题讲起&#xff1a; f(x)是定义在[0,1]上的…

Netty 服务端开发及性能优化

Netty 是一个异步基于事件驱动的高性能网络通信框架&#xff0c;可以看做是对 NIO 和 BIO 的封装&#xff0c;并提供了简单易用的 API、Handler 和工具类等&#xff0c;用以快速开发高性能、高可靠性的网络服务端和客户端程序。 1. 创建服务端 服务端启动需要创建 ServerBoot…

面试官说,Java中的volatile关键字有什么作用?

在Java中&#xff0c;volatile是一个关键字&#xff0c;它用于标记变量&#xff0c;以指示该变量可能随时被多个线程访问并修改。从面试的角度来看&#xff0c;了解volatile关键字的作用和原理对于Java开发人员来说非常重要。在本文中&#xff0c;我将详细讲解volatile关键字的…

springboot+vue班级综合测评管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的班级综合测评管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1…

prometheus中通过node-exporter中的--collector.textfile.directory这一选项参数自定义监控指标

简述node-exporter中该选项参数的作用。 --collector.textfile.directory 是 Node Exporter 的一个命令行选项&#xff0c;用于指定从 textfile 收集器中收集数据的目录。 Node Exporter 会通过各种方式收集主机的度量值&#xff0c;并将这些度量值暴露给 Prometheus。其中之…

【嵌入式烧录刷写文件】-2.3-删除/修改Intel Hex文件中指定地址范围内的数据

案例背景&#xff08;共6页精讲&#xff09;&#xff1a; 有如下一段HEX文件&#xff0c;如何“自动”地完成地址范围0x9110-0x9113数据的删除或修改。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485…

C++ STL之 list 基础

文章目录 前言STL之list基础知识1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 空间相关2.4 元素访问2.5 相关函数2.6 list的迭代器失效 3. list与vector的对比 后记 前言 本篇将学习 list 的基础知识 &#x1f57a;作者&#xff1a; 迷茫的启明星 专栏…

网络安全从业人员职业发展和规划

1、为什么做这次分享&#xff1f; 2、人生周期三模型 3、职业生涯阶段划分 4、通用职业发展路径 5、当前安全行业前景如何&#xff1f; 6、安全就业行情如何&#xff1f; 7、安全行业就业市场岗位划分 8、什么是相对比较好的履历&#xff1f; 9、选择甲方还是选择乙方&#xf…

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

Prompt learning 教学[技巧篇]&#xff1a;通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案 技巧1&#xff1a;To Do and Not To Do 在问答场景里&#xff0c;为了让 AI 回答更加准确&#xff0c;一般会在问题里加条件。比如让 AI 推荐一部电影给你 Recomme…

【高数+复变函数】傅里叶变换

文章目录 【高数复变函数】傅里叶变换3 傅里叶变换3.1 基本概念3.2 单位脉冲函数及其傅里叶变换3.3 非周期函数的频谱 上一节 【高数复变函数】傅里叶积分 【高数复变函数】傅里叶变换 3 傅里叶变换 3.1 基本概念 回顾&#xff1a;上一节中的Fourier积分公式 f ( t ) 1 2…

前端二进制流的关系

Blob 全称&#xff1a;binary large object&#xff0c;二进制大对象&#xff0c;是一个js对象&#xff0c;可以用来存储大量二进制编码格式的数据&#xff0c;Blob对象是不可修改的&#xff0c;读取内容的唯一方法是FileReader。 创建一个Blob对象&#xff1a; new Blob(ar…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--后端实现

目录 SSM(Vue3ElementPlusAxiosSSM前后端分离)--后端实现 技术栈 实现功能04-添加家居信息 需求分析/图解 思路分析 代码实现 创建\service\FurnService.java 和\service\FurnServiceImpl.java, 增加添加方法 修改Furn.java , 当创建Furn 对象imgPath 为null 时, imgPa…

Java14-常用类:字符串,日期类,比较器

一&#xff1a;字符串&#xff1a;String 1.概述&#xff1a; String&#xff1a;字符串&#xff0c;使用一对""引起来表示。 1.String 声明 为final的&#xff0c;不可被继承 2.String 实现了Serializable接口&#xff1a;表示字符串是支持序列化的。 实现了Co…

多线程相关高频面试题

一、线程的基础知识 1、线程和进程的区别&#xff1f; 进程是正在运行程序的实例&#xff0c;进程中包含了线程&#xff0c;每个线程执行不同的任务。不同的进程使用不同的内存空间&#xff0c;在当前进程下的所有线程可以共享内存空间。线程更轻量&#xff0c;线程上下文切换…