【Spring 篇】基于XML的Spring事务控制详解

news2024/12/26 15:12:15

在这里插入图片描述

Spring框架作为Java开发中的瑞士军刀,提供了许多方便而强大的功能,其中之一就是事务管理。事务是数据库操作中的关键概念,它确保一系列操作要么全部成功,要么全部失败。今天我们将深入探讨基于XML配置的Spring事务控制,以帮助那些初学者更好地理解和应用这一关键功能。

1. 事务的基础概念

在开始之前,我们需要明确事务的基础概念。事务通常由一系列数据库操作组成,这些操作要么全部执行成功,要么全部回滚,以确保数据的一致性和完整性。在开发过程中,我们可能会遇到各种情况,比如数据库插入、更新、删除等操作,这时事务就显得尤为重要。

2. Spring框架简介

Spring框架是一个全栈的Java应用程序框架,提供了广泛的基础设施支持,其中包括依赖注入、面向切面编程、事务管理等功能。今天我们聚焦在Spring的事务管理上,看看如何使用XML配置来处理事务。

3. 为什么选择XML配置事务?

在Spring中,我们有两种方式来配置事务,一种是基于注解的配置,另一种就是基于XML的配置。为什么选择XML配置呢?XML配置更加灵活,适用于一些复杂的场景,而且能够清晰地将事务的配置与业务逻辑分离,使得代码更易读、易维护。

4. XML配置事务的基本结构

首先,我们需要在Spring配置文件中引入事务管理的命名空间,并配置事务管理器和事务通知。以下是一个简单的例子:

<!-- 引入事务命名空间 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- 数据库连接配置 -->
        <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!-- 配置事务切面 -->
    <aop:config>
        <aop:pointcut id="transactionalMethods" expression="execution(* com.example.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalMethods"/>
    </aop:config>

</beans>

在这个例子中,我们配置了数据源、事务管理器、事务通知和事务切面。这里的transactionManagerdataSource需要根据实际情况配置,确保连接到你的数据库。

5. 配置事务的传播行为

在Spring事务中,传播行为定义了事务方法如何在现有事务中运行。Spring提供了丰富的传播行为选项,比如REQUIREDREQUIRES_NEW等。让我们看一个例子:

<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>

在这个例子中,我们配置了save*update*delete*开头的方法都应该在一个现有的事务中运行,如果不存在事务,则创建一个新的事务。

6. 声明式事务的好处

使用基于XML的声明式事务有很多好处。首先,它将事务的配置与业务逻辑分离,使得代码更加清晰。其次,它降低了事务管理的复杂性,开发者只需关注业务逻辑,而不用担心事务的具体实现细节。最重要的是,这种方式使得事务的管理更加一致,不容易出现遗漏或错误。

7. 示例演示

让我们通过一个简单的示例演示如何使用基于XML的Spring事务控制。

首先,假设我们有一个UserService类,其中包含了一些用户相关的数据库操作方法:

public interface UserService {
    void createUser(String username, String password);
    void updateUserPassword(String username, String newPassword);
    void deleteUser(String username);
}

接下来,我们实现这个接口并添加相应的数据库操作:

public class UserServiceImpl implements UserService {

    private JdbcTemplate jdbcTemplate;

    // 省略其他属性和方法

    @Override
    public void createUser(String username, String password) {
        jdbcTemplate.update("INSERT INTO users(username, password) VALUES (?, ?)", username, password);
    }

    @Override
    public void updateUserPassword(String username, String newPassword) {
        jdbcTemplate.update("UPDATE users SET password = ? WHERE username = ?", newPassword, username);
    }

    @Override
    public void deleteUser(String username) {
       jdbcTemplate.update("DELETE FROM users WHERE username = ?", username);
    }
}

现在,我们希望对这些数据库操作添加事务管理。首先,确保在Spring配置文件中引入了事务的命名空间,并配置了事务管理器和事务通知。接下来,我们需要在UserService接口的实现类上添加事务配置,让我们修改一下UserServiceImpl

<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

在这个配置中,我们创建了一个名为userService的bean,并注入了jdbcTemplate。现在,让我们通过XML配置事务通知,将事务织入UserService的实现类:

<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="create*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="transactionalMethods" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalMethods"/>
</aop:config>

在这个配置中,我们为create*update*delete*方法配置了事务的传播行为为REQUIRED,这意味着这些方法将在一个现有的事务中运行,如果不存在事务,则创建一个新的事务。

通过以上配置,我们成功地将事务管理添加到了UserService的实现类中。现在,当调用createUserupdateUserPassworddeleteUser方法时,如果发生异常,事务将回滚,确保数据的一致性。

8. 总结

通过本文的详细讲解,我们深入了解了基于XML的Spring事务控制。从事务的基础概念开始,到Spring框架的简介,再到XML配置事务的基本结构和传播行为的配置,最后通过一个实例演示了如何将事务添加到业务逻辑中。希望通过这篇博客,读者能够更加深入地理解和运用Spring事务管理,为项目的稳健性和可维护性做出贡献。在开发过程中,事务管理是一个至关重要的环节,通过合理的配置,我们能够更好地保障数据的完整性,提高系统的稳定性。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

网安入门13-文件上传(htaccess,其他绕过)

空格绕过&#xff0c;点号绕过 Pass-07 直接上传肯定是失败的 把文件名1.php改成1.php.或1.php_(下划线为空格)&#xff0c;这种命名方式在windows系统里是不被允许的&#xff0c;所以需要在burp之类里进行修改&#xff0c;然后绕过验证后&#xff0c;会被windows系统自动去掉…

Graphpad Prism10.1.2(324) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

服务器部署项目,访问验证码出现Handler dispatch failed....InvocationTargeException

场景&#xff1a; 部署ruoyi-vue的jar。访问验证码接口时&#xff0c;出现异常。本地测试没有问题&#xff0c;起初使用的jdk8&#xff0c;怀疑jdk版本问题&#xff0c;但是本地使用11.0.15版本也没问题&#xff0c;后面也就没管&#xff0c;初步排除jdk版本的问题。之前项目也…

C语言程序设计(数据类型)

C 数据类型 在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&#xff1a; 序号类型与描述1基本数据类型 它们是算术类型&#x…

20240113斐波那切数列

代码 def fibonacci(n):fib_list [0, 1] # 初始的斐波那契数列&#xff0c;包含0和1while len(fib_list) < n:next_number fib_list[-1] fib_list[-2]fib_list.append(next_number)return fib_list[:n]# 示例&#xff1a;计算前10个斐波那契数 n 10 result fibonacci…

C++学习笔记——多态与静态联编和动态联编

目录 一、多态 二、静态联编&#xff08;Static Binding&#xff09;和动态联编&#xff08;Dynamic Binding&#xff09; 2.1静态联编 2.2动态联编 一、多态 是C中面向对象编程的一个核心概念&#xff0c;它允许派生类对象替代其基类对象&#xff0c;从而实现代码重用和扩…

鸿蒙APP的设备适配

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一种分布式操作系统&#xff0c;用于支持多种设备类型&#xff0c;包括智能手机、平板电脑、智能电视、智能穿戴等。在进行鸿蒙APP的设备适配时&#xff0c;需要注意以下几个方面&#xff0c;希望对大家有所帮助。北京木奇移…

使用AutoDL云计算平台训练并测试Pytorch版本NeRF代码

文章目录 前言一、数据集及代码获取二、租用并设置服务器三、Pycharm远程开发四、训练并测试代码 前言 因为第一次在云服务器上跑代码&#xff0c;所以在这里记录一下。 一、数据集及代码获取 nerf-pytorch项目是 NeRF 的忠实 PyTorch 实现&#xff0c;它在运行速度提高 1.3 倍…

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

文章目录 引言一、MQTT理论部分二、使用MQTT.fx接入物联网设备三、使用ESP8266连接阿里云四、参考例程 引言 阿里云物联网平台的接入方式有很多种&#xff0c;从阿里云提供的开发文档可以看到&#xff0c;支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等&#x…

STL之map

目录 map(常用) map的函数 multimap(几乎不用-时间复杂度不稳定) mutimap的函数 unordered_map(一般不用) unordered_map的函数 代码示例 1.map 2、multimap 3、unordered_map map(常用) map是一种关联容器&#xff0c;用于存储一组键值对(key-value pairs)&#xf…

运用3d技术建立数字化模型---模大狮模型网

随着科技的不断进步和发展&#xff0c;3D技术已经被广泛运用于各个领域。其中&#xff0c;建立数字化模型是3D技术的一个重要应用方向。本文将从3D技术的概念、数字化模型的定义、数字化模型的建立方法、应用领域等方面介绍运用3D技术建立数字化模型的相关知识。 一、3D技术的概…

【论文阅读】Non-blocking Lazy Schema Changes in Multi-Version

Non-blocking Lazy Schema Changes in Multi-Version Database Management Systems 1. Intro 1.1 Motivation 一个是online能够提供不停机的更新的能力&#xff0c;在很多业务系统里面是必要的。第二个是满足高可用&#xff0c;SaaS、PaaS要提供高可用的系统给用户&#xff…

你的编程能力什么时候开始有了质的飞跃?

建议看看计算机科学速成课&#xff0c;一门很全面的计算机原理入门课程&#xff0c;短短10分钟可以把大学老师十几节课讲不清楚的东西讲清楚&#xff01;整个系列一共41个视频&#xff0c;B站上有中文字幕版。 每个视频都是一个特定的主题&#xff0c;例如软件工程、人工智能、…

Goby 漏洞发布|用友 NC registerServlet 反序列化远程代码执行漏洞

漏洞名称&#xff1a;用友 NC registerServlet 反序列化远程代码执行漏洞 English Name&#xff1a;Yonyou NC registerServlet Deserialize Remote Code Execute Vulnerability CVSS core: 9.8 影响资产数&#xff1a; 21320 漏洞描述&#xff1a; 用友 NC Cloud 是一种商…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事&#xff0c;Google 了 N 篇文章竟然没有一篇是可以跑起来的&#xff01; 少部分教程是给出了自我矛盾的配置&#xff08;是的&#xff0c;按照贴出来的代码和配置&#xff0c;他自己都跑不起来&#xff09;&#xff0c;大部…

AOT-GAN-for-Inpainting项目解读|使用AOT-GAN进行图像修复

项目地址&#xff1a; https://github.com/researchmm/AOT-GAN-for-Inpainting 基于pytorch实现 论文地址&#xff1a; https://arxiv.org/abs/2104.01431 开源时间&#xff1a; 2021年 项目简介&#xff1a; AOT-GAN-for-Inpainting是一个开源的图像修复项目&#xff0c;其对 …

1.12 力扣中等图论

797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节…

apipost 前端使用云端mock实现自定义返回

目录 一.新建接口 1.选择mock环境 2.设置接口路径&#xff0c;以及相关参数 3.自定应响应示例 4.开启云端mock,设置相应条件 5.更改接口类型post,保存设置&#xff0c;发送请求 6.测试 一.新建接口 1.选择mock环境 如图&#xff0c;更改环境 2.设置接口路径&#xff0c…

线程池用法很简单?来看看这些问题能问翻你!

背景 这是张小帅失业之后的第三场面试。 面试官&#xff1a;“实际开发中用过多线程吧&#xff0c;那聊聊线程池吧”。 “有CachedThreadPool:可缓存线程池,FixedThreadPool:定长线程池.......balabala”。小帅暗暗窃喜&#xff0c;还好把这几种线程池背下来了&#xff0c;看…

C++每日一练(15):简单幂计算

题目描述 输入两个数a和b&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…