Spring-事务支持

目录

一、事务概述

二、引入事务场景

三、Spring对事务的支持 

Spring实现事务的两种方式

声明式事务之注解实现方式

    1.在Spring配置文件中配置事务管理器   

    2. 在Spring配置文件引入tx命名空间

    3. 在Spring配置文件中配置“事务注解驱动器”,通过注解的方式控制事务

    4. Service类或方法上添加@Transaction注解

    5.执行转账操作

声明式事务之全注解开发 

    1.配置类替代配置文件

    2.测试程序

    3.测试结果 

声明式事务之XML实现方式

    1.Spring配置文件

     2.编写测试程序

     3.测试结果


一、事务概述

  • 在一个业务流程中,通常需要多条DML语言共同联合完成,这多条DML语句必须同时成功或失败,这样才能保证数据的安全。
  • 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
  • 事务的四个处理流程
  1. 开启事务(begin transaction)
  2. 执行核心业务代码
  3. 提交事务(业务执行过程没有出现异常) (commit transaction)
  4. 回滚事务(业务执行过程中出现异常)(rollback transaction)
  • 事务的ACID特性
  1. 原子性(Atomicity)事务小的工作单元,不可划分。
  2. 一致性(Consistency)事务要么同时成功,要么同时失败。
  3. 隔离性(Isolation)隔离性实际上解决的问题是多个事务作用于同一个或者同一批数据时的并发问题,防止由于交叉执行而导致数据的不一致。一个完美的事务隔离,在每个事务看来,整个系统只有自己在工作,对于整个系统而言这些并发的事务一个接一个的执行,也仿佛只有一个事务,这样的隔离成为“可序列化(Serializability)”。当然,这样的隔离级别会带来巨大的开销,因此出现了各种各样的隔离级别,进而满足不同场景的需要。
  4. 持久性(Durability)只要事务完成,不管发生任何问题,都不应该发生数据丢失。即,事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

二、引入事务场景

以银行转账为例 ,有两个账户act1 和 act2,act1向act2转账10000,对于这个流程包括两个操作,act1减10000,act2加10000,这两步必须同时成功或者同时失败。

  • 转账成功,act 减10000, act2 加 10000 
  • 转账失败,act减10000后,因系统故障,act2没有加10000

数据库为了避免这种特殊情况的发生,提出了事务概念。例如:通过jdbc连接数据库后,可以手动开启事务,提交事务,回滚事务。我们可以借助aop技术实现事务管理,更幸运的是Spring提供了事务支持。

三、Spring对事务的支持 

  • Spring实现事务的两种方式

  1. 编程式事务 通过编写代码的方式实现事务的管理
  2. 声明式事务 基于注解方式、XML配置方式
  • 声明式事务之注解实现方式

    1.在Spring配置文件中配置事务管理器   
<!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dateSource"/></bean>
    2. 在Spring配置文件引入tx命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    3. 在Spring配置文件中配置“事务注解驱动器”,通过注解的方式控制事务
<!--开启事务注解驱动器,开始事务注解。--><tx:annotation-driven transaction-manager="txManager"/>
    4. Service类或方法上添加@Transaction注解
package com.xxx.bank.service.impl;import com.xxx.bank.dao.AccountDao;
import com.xxx.bank.pojo.Account;
import com.xxx.bank.service.AccountService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService {@Resource(name = "accountDao")private AccountDao accountDao;@Overridepublic void transfer(String fromActno, String toActno, double money) {Account fromAct = accountDao.selectByActno(fromActno);if (fromAct.getBalance() < money) {throw new RuntimeException("余额不足,无法转账!!!");}Account toAct = accountDao.selectByActno(toActno);fromAct.setBalance(fromAct.getBalance() - money);toAct.setBalance(toAct.getBalance() + money);int count = accountDao.update(fromAct);count += accountDao.update(toAct);/*模拟异常String s = null;s.toString();*/if (count != 2) {throw new RuntimeException("转账失败,请联系银行...");}}
}
    5.执行转账操作

当前账户情况

执行一次转账

模拟异常情况,检查是否转账成功

  • 声明式事务之全注解开发 

    1.配置类替代配置文件
package com.zhj.bank;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;/*** @author zhj1259615665@qq.com* @create 2023-10-04 {16:45}*/
@Configuration
// 开启组件扫描
@ComponentScan("com.zhj.bank")
// 开启事务管理
@EnableTransactionManagement
public class Spring6Config {@Bean(name = "dataSource")public DruidDataSource getDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3307/spring");dataSource.setUsername("root");dataSource.setPassword("123456");return dataSource;}@Bean(name = "jdbcTemplate")public JdbcTemplate getJdbcTemplate(DataSource dataSource) {JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}@Bean(name = "txManager")public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager txManager = new DataSourceTransactionManager();txManager.setDataSource(dataSource);return txManager;}
}
    2.测试程序
@Testpublic void testNoXml() {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Spring6Config.class);AccountService accountService = applicationContext.getBean("accountService", AccountService.class);try {accountService.transfer("act-001", "act-002", 10000);System.out.println("转账成功");} catch (Exception e) {e.printStackTrace();}}@Testpublic void test() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");AccountService accountService = applicationContext.getBean("accountService", AccountService.class);try {accountService.transfer("act-001", "act-002", 10000);System.out.println("转账成功");} catch (Exception e) {e.printStackTrace();}}
    3.测试结果 

  • 声明式事务之XML实现方式

    1.Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启组件扫描--><context:component-scan base-package="com.zhj.bank"/><!--配置数据源--><bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3307/spring"/><property name="username" value="root"/><property name="password" value="123456"/></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dateSource"/></bean><!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dateSource"/></bean><!--配置通知,具体的增强代码--><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="transfer" propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置切面--><aop:config><aop:pointcut id="txPointcut" expression="execution(* com.zhj.bank.service..*(..))"/><!--切面 = 切点 + 通知--><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config>
</beans>
     2.编写测试程序
public class BankTxTest {@Testpublic void test() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");AccountService accountService = applicationContext.getBean("accountService", AccountService.class);try {accountService.transfer("act-001", "act-002", 10000);System.out.println("转账成功...");} catch (Exception e) {e.printStackTrace();}}
}
     3.测试结果

转账一次

模拟异常情况


        事务在数据库中是十分重要的概念,Spring提供了两种事务的支持方式,这篇博客记录了一点点的知识点,通过银行转账案例希望可以帮助你更好地理解事务。上述内容如果有错误的地方,希望大佬们可以指正。我一直在学习的路上,您的帮助使我收获更大!觉得对您有帮助的话,还请点赞支持!我也会不断更新文章!

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

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

相关文章

【算法】算法题-20231130

这里写目录标题 一、290. 单词规律二.、存在重复元素 II三、128. 最长连续序列 一、290. 单词规律 简单 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s…

学会XPath,轻松抓取网页数据

一、定义 XPath&#xff08;XML Path Language&#xff09;是一种用于在 XML 文档中定位和选择节点的语言。XPath的选择功能非常强大&#xff0c;可以通过简单的路径选择语法&#xff0c;选取文档中的任意节点或节点集。学会XPath&#xff0c;可以轻松抓取网页数据&#xff0c…

为什么 SQL 日志文件很大,我应该如何处理?

SQL Server 日志文件是记录所有数据库事务和修改的事务日志文件。在 SQL 术语中&#xff0c;此日志文件记录对数据库执行的所有 INSERT、UPDATE 和 DELETE 查询操作。 如果数据库处于联机状态或处于恢复状态时日志已满&#xff0c;则 SQL Server 通常会发出 9002 错误。在这种…

技术前沿丨Teranode如何实现无限扩容

​​发表时间&#xff1a;2023年9月15日 BSV区块链协会的技术团队目前正在努力开发Teranode&#xff0c;这是一款比特币节点软件&#xff0c;其最终目标是实现比特币的无限扩容。然而&#xff0c;正如BSV区块链协会网络基础设施负责人Jake Jones在2023年6月举行的伦敦区块链大会…

应用密码学期末复习(3)

目录 第三章 现代密码学应用案例 3.1安全电子邮件方案 3.1.1 PGP产生的背景 3.2 PGP提供了一个安全电子邮件解决方案 3.2.1 PGP加密流程 3.2.2 PGP解密流程 3.2.3 PGP整合了对称加密和公钥加密的方案 3.3 PGP数字签名和Hash函数 3.4 公钥分发与认证——去中心化模型 …

php+vue.js流浪动物宠物领养公益网站phpstudy/wamp/xammp

使用公益网站的分为管理员和用户二个权限子模块。 管理员所能使用的功能主要有&#xff1a;首页、个人中心、用户管理、咨询新闻管理、网站公告管理、绝育公告管理、合作医院管理、咨询类型管理、待领养动物管理、动物品种管理、动物领养管理、动物绝育申请管理、系统管理等。 …

fiddler抓包安卓

一、打断点 1、安卓手机和电脑在同一局域网下&#xff0c;手机连接的网络开启手动代理&#xff0c;ip填写电脑ip&#xff0c;端口填写fiddler中配置的端口。 ip查看&#xff1a; 端口配置&#xff1a;tools-options-connections 2、安装证书&#xff0c;手机浏览器输入电脑ip…

【深度学习】KMeans中自动K值的确认方法

1 前言 聚类常用于数据探索或挖掘前期&#xff0c;在没有做先验经验的背景下做的探索性分析&#xff0c;也适用于样本量较大情况下的数据预处理等方面工作。例如针对企业整体用户特征&#xff0c;在未得到相关知识或经验之前先根据数据本身特点进行用户分群&#xff0c;然后再…

22款奔驰GLS450升级香氛负离子 淡淡的幽香

香氛负离子系统是由香氛系统和负离子发生器组成的一套配置&#xff0c;也可以单独加装香氛系统或者是负离子发生器&#xff0c;香氛的主要作用就是通过香氛外壳吸收原厂的香水再通过空调管输送到内饰中&#xff0c;而负离子的作用就是安装在空气管中通过释放电离子来打击空气中…

基于JSP的网上购书系统的设计与实现

基于JSP的网上购书系统设计与实现 摘要&#xff1a; 随着如今互联网与计算机技术的高速发展&#xff0c;各种先进的技术为人们的生活带来了极大的方便&#xff0c;网络应用领域也一天天扩大。在虚拟网络中买卖交易商品&#xff0c;人们越来越来喜欢这种网上购物方式&#xff0…

SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队

前言&#xff1a;作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例&#xff0c;因此整理了本文&#xff0c;主要介绍SpringMvc集成Sentinel SpringMvc集成Sentinel 一、Sentinel 介绍 随着微服务的流行&…

拼图 游戏

运行出的游戏界面如下&#xff1a;按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password;p…

linxu磁盘介绍与磁盘管理

SAS硬盘 300G 600G 900G 容量 SATA硬盘 SSD 固态硬盘 SCSI硬盘 IDE硬盘 df (disk free) 列出文件系统的整体磁盘使用量 df -h du &#xff08;desk used&#xff09; 检查磁盘空间使用量 du --help fdisk 用来磁盘分区 fdisk -l

Vue diff 算法探秘:如何实现快速渲染

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Spring第三课,Lombok工具包下载,对应图书管理系统列表和登录界面的后端代码,分层思想

目录 一、Lombok工具包下载 二、前后端互联的图书管理系统 规范 三、分层思想 三层架构&#xff1a; 1.表现层 2.业务逻辑层 3.数据层 一、Lombok工具包下载 这个工具包是为了做什么呢&#xff1f; 他是为了不去反复的设置setting and getting 而去产生的工具包 ⚠️工具…

为计算机设计一个完美的思维模型,帮找bug和漏洞,一起来做渗透测试吧 最赚钱的10种思维模型

芒格 如果我不能淘汰自己一年前的思维模型&#xff0c;这一年我就白过了。&#xff08;终身学习&#xff0c;不断迭代自己。&#xff09; 思维模型是什么&#xff0c;有哪些&#xff1f; 思维模型是用来简化和理解复杂现实世界的概念框架。它们是一种思考和解决问题的工具&a…

QT学习_16_制作软件安装包

1、准备软件exe及其运行环境 参考&#xff1a;Qt学习_12_一键生成安装包_江湖上都叫我秋博的博客-CSDN博客 这篇博客记录了&#xff0c;如何用window的脚本&#xff0c;一键生成一个可以免安装的软件压缩包&#xff0c;解压缩后&#xff0c;点击exe文件就可以直接运行。 这一…

国内如何访问github

1 购买一台美国硅谷的服务器 https://account.aliyun.com/login/login.htm?oauth_callbackhttps%3A%2F%2Fecs-buy.aliyun.com%2Fecs%3Fspm%3D5176.8789780.J_4267641240.2.721e45b559Ww1z%26accounttraceid%3Def6b6cc734bc49f896017a234071bfd9bctf 记得配置公网的ip&#xf…

AtCoder Beginner Contest 330 A~F

A.Counting Passes(暴力) 题意&#xff1a; 给定 n n n个学生的分数&#xff0c;以及及格分 x x x &#xff0c;问多少人及格了。 分析&#xff1a; 暴力枚举&#xff0c;依次判断每个学生的分数即可。 代码&#xff1a; #include <bits/stdc.h> using namespace s…

超融合数据中心如何搭建?有哪些优势?

导语 随着全社会数字经济的发展&#xff0c;企业的数字化转型正加速推进。这其中&#xff0c;占据所有企业数量 99.8% 的中小企业&#xff0c;像是社会的毛细血管广泛遍布在各个领域&#xff0c;相对大企业对市场更敏感、决策更灵活。这些因素本应有利于数字化转型&#xff0c…