当前位置: 首页 > news >正文

spring之声明式事务开发

文章目录

  • 一、声明式事务之全注解式开发
    • 1、新建springConfig类
    • 2、测试程序
    • 3、测试结果
  • 二、声明式事务之XML实现方式
    • 1、配置步骤
    • 2、测试程序
    • 3、运行结果


一、声明式事务之全注解式开发

基于之前的银行转账系统,将spring.xml配置文件嘎掉,变成全注解式开发。
加入事务的银行转账

原spring.xml文件:

<?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"><context:component-scan base-package="com.powernode.bank"></context:component-scan><!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/dududu"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean><!--配置JDBCTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--事务注解驱动器--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven></beans>

1、新建springConfig类

1、@Configuration:表示代替spring.xml配置文件,在这个类当中完成配置
2、@ComponentScan(“com.powernode.bank”):代替spring.xml文件中的组件扫描
3、@EnableTransactionManagement:代替spring.xml文件中的事务注解驱动器

@Configuration  //表示代替spring.xml配置文件,在这个类当中完成配置
@ComponentScan("com.powernode.bank")
@EnableTransactionManagement //代替事务注解驱动器
public class springConfig {
}

spring.xml文件中还剩余3个bean,都有属性、值。

<!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/dududu"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean><!--配置JDBCTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>

4、@Bean+get方法,并且get方法执行结束的返回值要求是spring.xml文件里bean标签的class对象

//spring框架看到这个@Bean注解后,会调用这个被标注的方法,这个方法的返回值是一个Java对象,这个Java对象会自动纳入IoC容器管理//返回的对象就是spring容器当中Bean对象@Bean(name = "dataSource")public DruidDataSource getDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/dududu");dataSource.setUsername("root");dataSource.setPassword("123456");return dataSource;}@Bean(name = "jdbcTemplate")public JdbcTemplate getJdbcTemplate(DataSource dataSource){ //spring在调用这个方法的时候会自动给我们传递过来一个dataSource对象JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}@Bean(name = "txManager")public DataSourceTransactionManager getTxManager(DataSource dataSource){DataSourceTransactionManager txManager = new DataSourceTransactionManager();txManager.setDataSource(dataSource);return txManager;}

2、测试程序

在这里插入图片描述

    @Testpublic void testNoXML(){ApplicationContext ac = new AnnotationConfigApplicationContext(springConfig.class);AccountService accountService = (AccountService) ac.getBean("accountService");try {accountService.transfer("act_001","act_002",10000);System.out.println("转账成功");}catch (Exception e){e.printStackTrace();System.out.println("转账失败");}}

3、测试结果

在这里插入图片描述
在这里插入图片描述
模拟异常,事务依然可以起作用,钱不会丢。

在这里插入图片描述
在这里插入图片描述

二、声明式事务之XML实现方式

全XML式开发,不使用注解。
那么原spring.xml文件中的事务注解驱动就需要嘎掉

    <!--事务注解驱动器--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>

嘎掉之后,那应该怎么添加事务?

再创建一个工程 为了不和原来的混在一起
在这里插入图片描述
AccountServiceImpl业务实现类中,基于事务的注解@Transactional删掉,原spring.xml文件中的事务注解驱动就需要嘎掉,pom文件中添加aspectj依赖,

1、配置步骤

  • 第一步:配置事务管理器
  • 第二步:配置通知
  • 第三步:配置切面

pps:需要添加AspectJ的依赖、添加aop命名空间

    <!--配置通知--><tx:advice id="txAdvice" transaction-manager="txManager"><!--配置通知的相关属性--><tx:attributes><!--之前所讲的事务属性,都可以在这个标签中配置--><tx:method name="transfer" propagation="REQUIRED" rollback-for="java.lang.Throwable"/></tx:attributes></tx:advice><!--配置切面--><aop:config><aop:pointcut id="txPointcut" expression="execution(* com.powernode.service..* (..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"></aop:advisor></aop:config>

<tx:method name=“transfer” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>这里一般不会写具体的方法,可以采用通配符的方式。
<tx:method name=“save*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“delete*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“insert*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“modify*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“query*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“find*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
<tx:method name=“get*” propagation=“REQUIRED” rollback-for=“java.lang.Throwable”/>
等等

2、测试程序

    @Testpublic void testNoAnnotation(){ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");AccountService accountService = ac.getBean("accountService", AccountService.class);try{accountService.transfer("act_001","act_002",20000);System.out.println("转账成功");}catch(Exception e){e.printStackTrace();System.out.println("转账失败");}}

在这里插入图片描述

3、运行结果

在这里插入图片描述

在这里插入图片描述

模拟异常:
空指针异常 事务回滚
在这里插入图片描述

在这里插入图片描述
钱不会丢

spring.xml配置文件

<?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:aop="http://www.springframework.org/schema/aop"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/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><context:component-scan base-package="com.powernode"></context:component-scan><!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/dududu"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean><!--配置JDBCTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--配置通知--><tx:advice id="txAdvice" transaction-manager="txManager"><!--配置通知的相关属性--><tx:attributes><!--之前所讲的事务属性,都可以在这个标签中配置--><tx:method name="transfer" propagation="REQUIRED" rollback-for="java.lang.Throwable"/></tx:attributes></tx:advice><!--配置切面--><aop:config><aop:pointcut id="txPointcut" expression="execution(* com.powernode.service..* (..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"></aop:advisor></aop:config>
</beans>

相关文章:

spring之声明式事务开发

文章目录一、声明式事务之全注解式开发1、新建springConfig类2、测试程序3、测试结果二、声明式事务之XML实现方式1、配置步骤2、测试程序3、运行结果附一、声明式事务之全注解式开发 基于之前的银行转账系统&#xff0c;将spring.xml配置文件嘎掉&#xff0c;变成全注解式开发…...

2023美赛参赛经历分享

今天早上登录MCM: The Mathematical Contest in Modeling (comap.com)发现论文提交已经显示Received。虽然这几天连连有开学恶补的期末考试&#xff0c;但还是忙里偷闲趁着新鲜写一篇关于美赛的参赛个人感受。跟我一起打这次美赛的都是软件等专业的hxd&#xff0c;他们之前没有…...

Elasticsearch在Linux中的单节点部署和集群部署

目录一、Elasticsearch简介二、Linux单节点部署1、软件下载解压2、创建用户3、修改配置文件4、切换到刚刚创建的用户启动软件5、测试三、Linux集群配置1、拷贝文件2、修改配置文件3、分别修改文件所有者4、启动三个软件5、测试四、问题总结1、在elasticsearch启动时如果报错内存…...

Scala的变量声明

文章目录变量声明&#xff08;一&#xff09;简单说明&#xff08;二&#xff09;利用val声明变量1&#xff0c;声明方式2&#xff0c;案例演示&#xff08;三&#xff09;利用var声明变量1&#xff0c;声明方式2&#xff0c;案例演示&#xff08;四&#xff09;换行输入语句&a…...

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置&#xff1a; 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行…...

Anaconda环境配置

1.进入清华大学镜像网站Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff0c;下载稳定版Anaconda3-5.2.0&#xff0c;如下图。2.放到整理好的文件夹中&#xff0c;双击安装包进行安装。3.安装过程中需要改变的默认值如下&#xff…...

Markdown编辑器使用方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

我国二氧化碳地质封存技术起步较晚&#xff0c;目前仍没有一套相对完整的行业规范&#xff1b;且就该技术而言&#xff0c;涉及环节众多&#xff0c;理论相对复杂&#xff0c;对于行业的新入局者不太友好。因此&#xff0c;结合时代背景&#xff0c;我们首次尝试对二氧化碳地质…...

算法笔记(十二)—— Manacher算法(回文子串)

计算字符串内的最大回文子串&#xff0c;常用的暴力扩散在应对长度为偶数的回文时会遇到一些问题。 Manacher基础&#xff1a;对字符串进行填充&#xff0c;在字符串开头结尾以及字符间填充‘#’&#xff0c;以来应对偶数回文时的问题。&#xff08;这是采用暴力扩再除2&#x…...

【数据结构】顺序表和链表的区别和联系(详解)

顺序表和链表的区别&#xff08;详解&#xff09; 文章目录顺序表和链表的区别&#xff08;详解&#xff09;前言一、顺序表和链表的关系二、顺序表1.优点2.缺点三、链表1.优点2.缺点四、区别表格总结前言 本文给大家介绍顺序表和链表的各自的优缺点和区别与联系&#xff0c;结…...

【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】【更新中】

文章目录一、实验目的二、实验要求三、实验内容四、实验报告要求一、实验目的 要求掌握Linux系统用户的创建、删除与管理操作&#xff1b;熟悉Linux文件系统的管理模式&#xff0c;学会创建用户文件系统并装载和卸载文件系统&#xff1b;掌握超级用户的管理方式与权限&#xf…...

华为OD机试真题 用 C++ 实现 - 整数分解 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

Java集合(一)---List和set

1.Java集合有哪些&#xff1f;集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)Map接口和Collection接口是所有集合框架的父接口&#xff1a;1. Collection接口的子接口包括&#xff1a;Set接口和List接口2. Map接口的实现类主要有&#xf…...

手撸一个Table组件(Table组件不过如此)

一、前言 手写Table组件这个文章我一直都想写&#xff0c;今天终于得空来写它了。小编认为Table组件是组件库里"较为复杂"的一个组件&#xff0c;因为它的扩展性非常强&#xff0c;并且它的基础样式如何去写都非常考究&#xff0c;那么今天我就带大家来实现一个基础…...

Python|Leetcode刷题日寄Part01

Python|Leetcode刷题日寄Part0101&#xff1a;两数之和02&#xff1a;无重复字符的最长子串03&#xff1a;两数相加04&#xff1a;反转链表05&#xff1a;有效的括号06&#xff1a;回文数07&#xff1a;删除有序数组中的重复项08&#xff1a;删除链表的倒数第N个结点09&#xf…...

微信小程序更改头像昵称

背景 前面写了一篇关于小程序头像昵称获取更改的方案&#xff0c;有很多小伙伴私信我发一个整体的逻辑思路&#xff01; 解决思路 前面的这篇文章中我们给出了页面中获取头像昵称的代码&#xff1a; <view class"headInfo" data-weui-theme"{{theme}}&qu…...

Linux 基础知识之文件系统

目录一、文件系统1.文件种类2.Linux和Windows文件后缀的不同3.查看文件类型3.绝对路径与相对路径二、系统分区三、目录结构一、文件系统 1.文件种类 Linux中一切皆文件。目光所及&#xff0c;皆是文件。文件的种类共有七种&#xff0c;每种文件都有自己的独特标识&#xff1a;…...

LeetCode 36. 有效的数独

LeetCode 36. 有效的数独 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 请你判断一个 9x99 x 99x9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1−91-91−9 在每一行只能出现一次。数字 1−91-91−9 在每一列…...

2023-02-22 cascades-columbia-核心处理记录

摘要: columbia是哥伦比亚对于cascades的一个改进, 并且paper写的也相对详尽. 虽然cacades的实现有很多,比较出名的就是greenplum的gporca, 不过columbia也有其显著的优点. 本文通过对columbia的分析展开对cascades优化器思想的探讨. 参考: 2023-02-10 哥伦比亚cascades-xu-…...

华为分布式存储(FusionStorage)

Server SAN SAN&#xff1a;存储区域网络 IP SAN&#xff1a;以太网交换机和普通网线连接的存储&#xff0c;交换机之间做堆叠FC SAN&#xff1a;FC&#xff08;光纤&#xff09;交换机和光纤连接的存储&#xff0c;交换机之间做级联Server SAN&#xff1a;可以使用以太网交换机…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...