spring —— 事务管理器

事务管理主要针对数据源进行操作:在数据库方面,通过 TransactionManager 事务管理器进行管理,表明一旦出现错误,该数据源的所有数据全部复原。那么数据库如何判断是否发生了错误呢?这就需要在代码方面,通过 @Transactional 注解管理相应的方法,表示一旦该方法出现错误,那么由该方法调用的数据就要执行回滚。

一、spring-config.xml 文件配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--扫描组件--><context:component-scan base-package="com.spring.book"></context:component-scan><!--引入外部文件--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><!--使用druid工具配置数据源--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${jdbc.url}"></property><property name="driverClassName" value="${jdbc.driver}"></property><property name="username" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean><!--将数据源作为属性传入JDBCTemplate对象--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="druidDataSource"></property></bean><!--将数据源作为属性传入DataSourceTransactionManager事务管理器对象--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="druidDataSource"></property></bean><!--启用事务管理器注解--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

二、数据库 

balance 设置为“无符号”,也就是不能为负数。 

三、java 代码

 Dao 层类:

package com.spring.book;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;@Component
public class BookDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public Integer getPriceByBookId(Integer bookId){String sql = "select price from book where bookid=?";return jdbcTemplate.queryForObject(sql, Integer.class, bookId);}public void updateStock(Integer bookId){String sql = "update book set stock=stock-1 where bookid=?";jdbcTemplate.update(sql, bookId);}public void updateBalance(Integer userId, Integer price){String sql = "update user set balance=balance-? where userid=?";jdbcTemplate.update(sql, price, userId);}
}

Service 类:

package com.spring.book;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class BookService {@Autowiredprivate BookDao bookDao;public void buyBook(Integer bookId, Integer userId){Integer price=bookDao.getPriceByBookId(bookId);bookDao.updateStock(bookId);bookDao.updateBalance(userId,price);}
}

Controller 类:

package com.spring.book;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class BookController {@Autowiredprivate BookService bookService;public void buyBook(Integer bookId, Integer userId){bookService.buyBook(bookId,userId);}
}

测试类:

import com.spring.book.BookController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.transaction.annotation.Transactional;@SpringJUnitConfig(locations = "classpath:bean-jdbc.xml")
public class TxByAnnotationTest {@Autowiredprivate BookController bookController;@Test@Transactionalpublic void testBuyBook(){bookController.buyBook(1,1);}
}

 四、说明

该案例模拟 user 从 book 列表中买书的过程,如果交易成功,book 的库存减少 1,user 的资金减少相应的价格。如果不添加事务管理的话,Dao 层的各个方法是互不影响的,会出现资金不减少,但库存减少的情况,因此需要将这些方法作为一个统一的整体。此时可以将 @Transactional 注解添加在 Service 层、Controller 层或者 Test 层均可实现效果,也就是说受到 @Transactional 注解影响到的方法一旦出现错误,那么该方法调用的数据都将恢复原状。而究竟是哪些数据,则由 spring-config.xml 配置文件的 TransactionManager 确定。

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

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

相关文章

TreeSize-Pro-9.0.1磁盘占用分析工具

软件下载 TreeSize-Pro-9.0.1磁盘占用分析工具是一个热门的 精品软件 网站&程序 这款软件操作简单&#xff0c;选择需要分析的磁盘开始分析后&#xff0c;左侧列表中很明显的看到磁盘下各个文件夹的大小。 选择文件夹后能在右边显示文件夹下的内容&#xff0c;并且也能显…

抖音直播弹幕数据逆向:websocket和JS注入

&#x1f50d; 思路与步骤详解 &#x1f575;️‍♂️ 思路介绍 首先&#xff0c;我们通过抓包工具进入的直播间&#xff0c;捕获其网络通信数据&#xff0c;重点关注WebSocket连接。发现直播弹幕数据通过WebSocket传输&#xff0c;这种方式比传统的HTTP更适合实时数据的传输。…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求&#xff0c;并确保所有请求都能正确处理并报告其状态。 假设有一个场景&#xff1a;有一个任务列表&#xff0c;有单个任务的处理功能…

alova的二次封装

alova的二次封装 为什么要进行alova二次封装二次封装的具体步骤1. index.js2. api.js3. service.js4. 在Vue中使用 为什么要进行alova二次封装 上篇文章介绍了alova的基本使用方法&#xff1a;alova详解&#xff0c;对比axios&#xff0c;alova的具体使用&#xff0c;但是每次…

【Qt】QLCDNumberQProgressBarQCalendarWidget

目录 QLCDNumber 倒计时小程序 相关属性 QProgressBar 进度条小程序 相关设置 QLCDNumber QLCDNumber是Qt框架中用于显示数字或计数值的小部件。通常用于显示整数值&#xff0c;例如时钟、计时器、计数器等 常用属性 属性说明intValueQLCDNumber显示的初始值(int类型)va…

企业版邮箱适用哪些企业

企业邮箱适合哪些企业呢&#xff1f;企业版邮箱为企业提供安全、稳定、集成的邮件服务&#xff0c;支持初创、中小、大型企业及特定行业需求。ZohoMail作为优质提供商&#xff0c;提供多层安全措施、移动访问、集成能力及定制化服务&#xff0c;满足不同规模企业需求。 一、企…

2023年系统架构设计师考试总结

原文链接&#xff1a;https://www.cnblogs.com/zhaotianff/p/17812187.html 上周六参加了2023年系统架构设计师考试&#xff0c;这次考试与以前有点区别&#xff0c;是第一次采用电子化考试&#xff0c;也是教材改版后的第一次考试。 说说考前准备&#xff1a;为了准备这次考试…

流媒体服务器Nginx with RTMP安装和配置

以下是在 CentOS 7.6 上安装和配置 Nginx with RTMP module 的详细步骤&#xff1a; 1. 安装 Nginx with RTMP 模块 1.1 安装必要的依赖和工具 首先&#xff0c;更新系统并安装必要的依赖包&#xff1a; sudo yum update -y sudo yum install -y epel-release sudo yum ins…

基于微信小程序的校园警务系统/校园安全管理系统/校园出入管理系统

摘要 伴随着社会以及科学技术的发展&#xff0c;小程序已经渗透在人们的身边&#xff0c;小程序慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;小程序这一名词已不陌生&#xff0c;越来越多的学校机构等都会定制一款属于自己个性化的小程…

利用arthas热更新class文件

利用arthas热更新class文件 背景&#xff1a;发现一个bug&#xff0c;家里难以复现&#xff0c;需要在现场环境更新几行代码验证。 arthas-boot version: 3.7.1 java -jar arthas-boot.jar启动arthas 1、利用arthas的sc命令查找确定类名称 sc com.**2、反编译为java文件 …

《通讯世界》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《通讯世界》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《通讯世界》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;科学技术部 主办单位&#xff1a;中国科学技…

C++ //练习 15.35 实现Query类和Query_base类,其中需要定义rep而无须定义eval。

C Primer&#xff08;第5版&#xff09; 练习 15.35 练习 15.35 实现Query类和Query_base类&#xff0c;其中需要定义rep而无须定义eval。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&#xff1a; #include<iostream>…

如何从零开始搭建一个django+vue的前后端分离的自动化测试平台

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐&#xff0c;今天手把手教大家搭建一个djangovue的前后端分离的自动化测试平台 一、前提条件 安装Python安装Node.js和npm&#xff08;或者yarn&#xff09;安装MySQL数据库安装Git 二、目录结构 project-root/├── backend…

关于虚拟机在桥接模式下连接网络问题的记录

2024年7月28日03:49:19 环境&#xff1a;ubuntu22.04 desktop 虚拟机 问题&#xff1a;使用wget下载nginx安装包时出现问题&#xff0c;443端口持续无连接成功回复。 随后在确定配置ip无问题&#xff0c;检查了其正常访问互联网&#xff0c;随后试图ping niginx网站&#xff…

基于OSS前端直传的分片上传以及断点续传

一、大文件分片上传 原型 大文件如果直接上传的话由于nginx的限制会导致响应500报错&#xff0c;或者响应时间过长导致响应超时 并且大文件上传有如下缺点 上传时间长: 对于大文件&#xff0c;直接上传可能需要较长时间&#xff0c;特别是在网络速度较慢或不稳定的情况下。这…

反射API安全白皮书:深入解析与防御策略

一、引言 反射API是编程中一种强大的工具&#xff0c;它允许程序在运行时动态地查询和操作对象的属性和行为。然而&#xff0c;这种灵活性也带来了显著的安全风险&#xff0c;如代码注入、信息泄露和绕过安全检查等。本文旨在深入解析反射API的安全问题&#xff0c;并提出相应…

ChatGPT秘籍:如何用AI阅读文献,提升你的学术效率

在当今信息泛滥的时代&#xff0c;迅速高效地搜集与处理信息显得尤为关键。本文将聚焦于如何利用ChatGPT高效阅读文献与文档&#xff0c;并提供详尽的技巧、心得以及实用的指令和插件解析&#xff0c;助你充分发挥ChatGPT的潜能。无论你是学生、科研人员还是行业从业者&#xf…

Laravel中的请求与响应:构建高效Web应用的秘诀

Laravel中的请求与响应&#xff1a;构建高效Web应用的秘诀 在Web开发的世界中&#xff0c;Laravel是一个优雅的PHP框架&#xff0c;以其简洁的语法和强大的功能而闻名。Laravel的请求&#xff08;Request&#xff09;和响应&#xff08;Response&#xff09;处理机制是构建高效…

雪花算法的一些问题解析

前言 最近做项目&#xff0c;有些老旧项目&#xff0c;需要生成分布式唯一ID&#xff0c;不允许重复&#xff0c;此时如果要对其他中间件和数据库依赖小&#xff0c;那么就需要一套固定的ID生成规则&#xff0c;雪花算法就正当合适&#xff0c;当时Twitter就是用来存储数据库I…

JSP基础语法与指令

任何语言都有自己的语法&#xff0c;在java中有&#xff0c;JSP作为java技术的一种应用&#xff0c;它拥有一些自己扩充的语法(了解知道即可&#xff01;&#xff01;&#xff01;)&#xff0c; Java所有语法都支持&#xff01; JSP表达式 <html><head><title…