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

Spring框架的事务管理

配置文件的方式

<!--第二种写法:使用提供标签的方式-->
<context:property-placeholder location="classpath:jd.properties"/><!--加载属性的文件(使用开源连接池)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean><!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务的通知(没有自己编写切面类,通知方法也不是自己编写,spring框架提供的)-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--对pay进行增强,设置隔离级别,传播行为,超时的时间--><!--isolation="DEFAULT":设置事务隔离级别为数据库默认级别。
propagation="REQUIRED":设置事务传播行为为REQUIRED(如果当前没有事务就新建一个,如果已存在就加入)。--><!--增删改需要进行事务管理--><tx:method name="pay" isolation="DEFAULT" propagation="REQUIRED"/><!--read-only="true":设置为只读事务(优化性能,适合查询操作),查询不需要--><tx:method name="find" read-only="true"/></tx:attributes>
</tx:advice>
<!--配置AOP的增强-->
<aop:config><!--spring框架提供系统通知,使用advisor标签,对哪个方法进行事务管理--><aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.qcby.demo2.AccountServiceImpl.pay(..))"/>
</aop:config>
<!--配置 service-->
<bean id="accountService" class="com.qcby.demo2.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<!--配置 dao-->
<bean id="accountDao" class="com.qcby.demo2.AccountDaoImpl"><property name="dataSource" ref="dataSource" />
</bean>

配置文件+直接的方式

 配置文件代码

<!--第二种写法:使用提供标签的方式-->
<context:property-placeholder location="classpath:jd.properties"/><!--加载属性的文件(使用开源连接池)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean><!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><!--配置jdbc模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>
</bean><!--开启注解扫描-->
<context:component-scan base-package="com.qcby.demo2"/><!--开启事务注解的支持-->
<tx:annotation-driven transaction-manager="transactionManager"/>

service代码

@Service
@Transactional(isolation = Isolation.DEFAULT)
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;public void pay(String out, String in, Double money) {accountDao.outMoney(out,money);//模拟异常//int a = 1/0;accountDao.inMoney(in,money);}
}

dao代码

@Component
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void outMoney(String out, double money) {jdbcTemplate.update("update account set money = money - ? where name = ?",money,out);}public void inMoney(String in, double money) {jdbcTemplate.update("update account set money = money + ? where name = ?",money,in);}
}

纯注解方式

配置类

@Configuration
@ComponentScan(basePackages = "com.qcby.demo2") //开启注解
@EnableTransactionManagement //开启事务注解
public class SpringConfig {//获取连接需要的属性@Bean(name = "dataSource")public DataSource createDataSource() throws Exception{//创建连接池对象,spring框架内置了连接池对象DriverManagerDataSource dataSource = new DriverManagerDataSource();//设置四个参数dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}//创建模板对象@Resource(name = "dataSource")  //不仅可以作用在属性上,也可以作用在方法上@Bean(name = "jdbcTemplate")  //把JdbcTemplate保存到IOC容器中public JdbcTemplate createJdbcTemplate(DataSource dataSource){JdbcTemplate template = new JdbcTemplate(dataSource);return template;}//创建平台事务管理器对象@Resource(name = "dataSource")@Bean(name = "transactionManager")public PlatformTransactionManager createTransactionManager(DataSource dataSource){DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);return manager;}
}

相关文章:

Spring框架的事务管理

配置文件的方式 <!--第二种写法:使用提供标签的方式--> <context:property-placeholder location"classpath:jd.properties"/><!--加载属性的文件&#xff08;使用开源连接池&#xff09;--> <bean id"dataSource" class"com.a…...

Spring MVC 中请求处理流程及核心组件解析

在 Spring MVC 中&#xff0c;请求从客户端发送到服务器后&#xff0c;需要经过一系列组件的处理才能最终到达具体的 Controller 方法。这个过程涉及多个核心组件和复杂的映射机制&#xff0c;下面详细解析其工作流程&#xff1a; 1. 核心组件与请求流程 Spring MVC 的请求处…...

PCIe Switch 问题点

系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…...

开源轻量级地图解决方案leaflet

Leaflet 地图&#xff1a;开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库&#xff0c;用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称&#xff0c;适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…...

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…...

如何实现金蝶云星空到MySQL的数据高效集成

金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确处理是关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“xsck-2金蝶销售出库-->mysql”。通过这一案例&#x…...

Web性能优化的未来:边缘计算、AI与新型渲染架构

一、边缘计算与性能优化深度整合 1.1 边缘节点计算卸载策略 • 智能任务分割:将非关键路径计算卸载到边缘节点 // 客户端代码 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer...

院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法

一、1911反转公约数 1.题目描述 2.解题思路 两个关键点&#xff1a;1.如何把数字反转&#xff0c;2.如何求最大公约数。 反转&#xff1a;用字符串形式存储&#xff0c;定义一个新的字符串倒序存储反转之后的字符串&#xff0c;将字符串按位转换位数字。 求最大公约数&…...

java输入输出类

父类 子类--->System.in(实例类) InputStream(抽象类,所有输入流的父类)|--->FileInputStream---->System.out(实例类&#xff09; OutpustStream(抽象类&#xff0c;所有输出流的父类)|----> FileOutputStream----&…...

Redis解析

Redis解析 一、单线程模型 redis在io层面是多线程的&#xff0c;在数据处理层面是单线程的。 多线程一般用于&#xff1a; 关闭连接删除/淘汰内存网络IO 1.1 io多路复用 redis使用nio&#xff08;select、poll、epoll&#xff09;的方式处理socket 主线程负责接收建立连接…...

golang -- 认识channel底层结构

channel channel是golang中用来实现多个goroutine通信的管道&#xff08;goroutine之间的通信机制&#xff09;&#xff0c;底层是一个叫做hchan的结构体&#xff0c;定义在runtime包中 type hchan struct {qcount uint // 循环数组中的元素个数&#xff08;通道…...

2025年Ai写PPT工具推荐,这5款Ai工具可以一键生成专业PPT

上个月给客户做产品宣讲时&#xff0c;我对着空白 PPT 页面熬到凌晨一点&#xff0c;光是调整文字排版就改了十几版&#xff0c;最后还是被吐槽 "内容零散没重点"。后来同事分享了几款 ai 写 PPT 工具&#xff0c;试完发现简直打开了新世界的大门 —— 不用手动写大纲…...

对称二叉树的判定:双端队列的精妙应用

一、题目解析 题目描述 给定一个二叉树&#xff0c;检查它是否是镜像对称的。例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的&#xff1a; 1/ \2 2/ \ / \ 3 4 4 3而 [1,2,2,null,3,null,3] 则不是镜像对称的&#xff1a; 1/ \2 2\ \3 3问题本质 判断一棵二叉…...

使用Python实现简单的人工智能聊天机器人

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...

React 播客专栏 Vol.11|Plain CSS 如何在 React 中优雅登场?

&#x1f44b; 欢迎回到《前端达人 React 播客书单》第 11 期&#xff08;正文内容为学习笔记摘要&#xff0c;音频内容是详细的解读&#xff0c;方便你理解&#xff09;&#xff0c;请点击下方收听 今天我们进入前端样式化的第一课&#xff0c;用最传统的方式 —— Plain CSS…...

css:倒影倾斜效果

这是需要实现的效果&#xff0c;平时用的比较多的是添加阴影&#xff0c;是box-shadow&#xff0c;而添加倒影是box-reflect&#xff0c;需要注意的是box-reflect需要添加浏览器前缀&#xff0c;比如我用的谷歌浏览器&#xff0c;要加-webkit-才能生效。 -webkit-box-reflect:…...

spring学习->sprintboot

spring IoC(控制翻转): 控制:资源的控制权(资源的创建&#xff0c;获取&#xff0c;销毁等) 反转:和传统方式不一样(用上面new什么)&#xff0c;不用new让ioc来发现你用什么&#xff0c;然后我来给什么 DI:(依赖注入) 依赖:组件的依赖关系。如newsController依赖NewsServi…...

语音识别——通过PyAudio录入音频

PyAudio 是一个用于处理音频的 Python 库&#xff0c;它提供了录制和播放音频的功能。通过 PyAudio&#xff0c;可以轻松地从麦克风或其他音频输入设备录制音频&#xff0c;并将其保存为文件或进行进一步处理。 安装 PyAudio 在使用 PyAudio 之前&#xff0c;需要先安装它。可…...

五月月报丨MaxKB在教育行业的应用进展与典型场景

在2025年的3月和4月的“用户应用月度报告”中&#xff0c;MaxKB开源项目组相继总结了MaxKB开源项目在政府、公共事业、教育、医疗以及企事业单位的应用情况。毫无疑问&#xff0c;在DeepSeek等国产大模型被各行各业的用户广泛接受之后&#xff0c;AI应用建设并运营的步伐也在显…...

算法练习:JZ51 数组中的逆序对

分析&#xff1a; 题干两个坑&#xff1a; 数组长度最大 1 0 5 10^5 105&#xff1b; P的值可能超过整型数据范围&#xff1b; 作为归并排序的变式。 为什么能用归并排序找到逆序对&#xff1f;因为归并排序的重组步骤中&#xff0c;左数组与右数组是有序的&#xff0c;对…...

【流程控制结构】

流程控制结构 流程控制结构1、顺序结构2、选择结构if基本选择结构if else语法多重if语法嵌套if语法switch选择结构 3、循环结构循环结构while循环结构程序调试for循环跳转语句区别 流程控制结构 1、顺序结构 流程图 优先级 2、选择结构 if基本选择结构 单if 语法 if&…...

掌握 Kotlin Android 单元测试:MockK 框架深度实践指南

掌握 Kotlin Android 单元测试&#xff1a;MockK 框架深度实践指南 在 Android 开发中&#xff0c;单元测试是保障代码质量的核心手段。但面对复杂的依赖关系和 Kotlin 语言特性&#xff0c;传统 Mock 框架常显得力不从心。本文将带你深入 MockK —— 一款专为 Kotlin 设计的 …...

嵌入式故障码管理系统设计实现

文章目录 前言一、故障码管理系统概述二、核心数据结构设计2.1 故障严重等级定义2.2 模块 ID 定义2.3 故障代码结构2.4 故障记录结构 三、故障管理核心功能实现3.1 初始化功能3.2 故障记录功能3.3 记录查询与清除功能3.4 系统自检功能 四、故障存储实现4.1 Flash 存储实现4.2 R…...

PowerBI基础

一、前言 在当今数据驱动的时代&#xff0c;如何高效地整理、分析并呈现数据&#xff0c;已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具&#xff0c;正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…...

一文了解多模态大模型LLaVA与LLaMA的概念

目录 一、引言 二、LLaVA与LLaMA的定义 2.1 LLaMA 2.2 LLaVA 2.3 LLaVA-NeXT 的技术突破 三、产生的背景 3.1 LLaMA的背景 3.2 LLaVA的背景 四、与其他竞品的对比 4.1 LLaMA的竞品 4.2 LLaVA的竞品 五、应用场景 5.1 LLaMA的应用场景 5.2 LLaVA的应用场景 六…...

E-R图合并时的三种冲突

属性冲突 属性冲突指的是在合并两个实体时&#xff0c;相同属性的数据类型、取值范围或约束条件不一致。例如&#xff0c;一个实体中的“年龄”属性定义为整数类型&#xff0c;而另一个实体中的“年龄”属性定义为字符串类型&#xff0c;这就产生了属性冲突。 命名冲突 命名…...

原生小程序+springboot+vue+协同过滤算法的音乐推荐系统(源码+论文+讲解+安装+部署+调试)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 在数字音乐产业迅猛发展的当下&#xff0c;Spotify、QQ 音乐、网易云音乐等音乐平台的曲…...

【MySQL】项目实践

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 项目实践概述1.1 项目实践的重要性1.2 项目中MySQL的典型应用场景 2. 数据库设计流程2.1 需求分析与规划2.2 设计过程示例2.3 数据库设计工具 3. 电子商务平台实践案例3.1 系统架构3.2 数据库Schema设计3.3 数…...

windows下authas调试tomcat

一般情况下&#xff0c;我们只需要输入以下代码 java -jar authas.jar调试tomcat时需要加上进程号 java -jar authas.jar <PID> 此外&#xff0c;如果你使用的是 Java 11 或更高版本&#xff0c;你需要添加 --add-opens 参数&#xff0c;以便 Arthas 能够访问 JVM 的内…...

回调函数应用示例

回调函数是一种通过函数指针&#xff08;或引用&#xff09;调用的函数&#xff0c;它在特定事件或条件发生时被另一个函数调用。回调函数的核心思想是将函数作为参数传递&#xff0c;以便在适当的时候执行自定义逻辑&#xff0c;常用于异步编程、事件驱动架构等场景。 业务场景…...