浅谈Spring6之事务(XML方式实现)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 事物:在一个业务流程中,通常需要多条DML(insert delete update)语句共同联合才能完成的,为了保证数据的安全,多条DML语句都必须同时成功,,或同时失败。

如有错误请指正,谢谢


事物:在一个业务流程中,通常需要多条DML(insert delete update)语句共同联合才能完成的,为了保证数据的安全,多条DML语句都必须同时成功,,或同时失败。


事物的四个处理过程:开启事务、执行核心业务代码、提交事务、回滚事务


事务的四个特性:


原子性:事务是最小工作单位,不可再分割


一致性:事务要么同时成功,要么同时失败,事务前和事务后的总量不变


隔离性:事务和事务之间有隔离性,互不干扰


持久性:持久性是事务结束的标志


Spring实现事务的两种方式


编程式事务:编写代码来实现事务的管理


声明式事务*:基于注解的方式、基于xml配置方式


以银行账户转账为案例

数据库表

113.png



112.png


spring6整合mybatis


pom.xml配置文件

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   4.0.0

   org.example

   spring6-transaction-bank

   1.0-SNAPSHOT

   

       17

       17

       UTF-8

   

   

   jar

   

   

       

       

           repository.spring.milestone

           Spring Milestone Repository

           https://repo.spring.io/milestone

       

   

   

   

       

           jakarta.annotation

           jakarta.annotation-api

           2.1.0

       

       

       

           org.springframework

           spring-context

           6.0.0-M2

       

       

       

           org.springframework

           spring-jdbc

           6.0.0-M2

       

       

       

           mysql

           mysql-connector-java

           8.0.17

       

       

       

           org.mybatis

           mybatis

           3.5.11

       

       

       

       

           org.mybatis

           mybatis-spring

           3.0.1

       

       

       

           com.alibaba

           druid

           1.2.15

       

       

       

           org.springframework

           spring-test

           6.0.0-M2

           

       

       

       

           org.springframework

           spring-aspects

           6.0.0-M2

       

       

       

           org.junit.jupiter

           junit-jupiter-api

           5.8.2

           test

       

   

   

       

           

               

               src/main/java

               

                   

                   **/*.properties

                   **/*.xml

               

               false

           

       

   



jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://IP:3306/mysql

jdbc.user= root

jdbc.password= xxxxxx

mybatis-config.xml配置文件


       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-config.dtd">

   

       

       

   

   

       

   



SpringConfig.xml配置文件

      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.xsd

                          http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

                          http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd

                          http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd

">

       

       

       

       

       

       

               

               

               

               

       

       

       

               

               

               

               

               

               

       

               

       

               

               

       

               

       

               

       

               

       

       

       

               

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

                       

               

       

       

       

               

               

               

               

       



BankDao接口

public interface BankDao {

   /**

    * 根据账号查询账户信息

    */

   List selectAll();

   /**

    * 根据actno查询账户信息

    * @param actno

    * @return

    */

   Bank selectByActno(String actno);

   /**

    * 更新账户信息

    * @param act

    * @return

    */

   int update(Bank act);

}


BankDao.xml


       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

           select * from bank    

           select actno,balance from bank where actno = #{actno}    

   

       update bank set  balance=#{balance}  where actno =#{actno}

   



pojo实体类

package com.qgs.pojo;

/**

* @author QGS

* @version 1.0.0

* @date 2023年03月24日 16:36:58

* @packageName com.qgs.pojo

* @className Bank

* @describe TODO

*/

public class Bank {

   private String actno;

   private Double balance;

   public Bank() {

   }

   public Bank(String actno, Double balance) {

       this.actno = actno;

       this.balance = balance;

   }

   public String getActno() {

       return actno;

   }

   public void setActno(String actno) {

       this.actno = actno;

   }

   public Double getBalance() {

       return balance;

   }

   public void setBalance(Double balance) {

       this.balance = balance;

   }

   @Override

   public String toString() {

       return "Bank{" +

               "actno='" + actno + '\'' +

               ", balance=" + balance +

               '}';

   }

}


BankService 接口

public interface BankService {

   /**

    * 转账方法

    * @param fromActno 转出账户

    * @param toActno 转入账户

    * @param money 金额

    */

   void transfer(String fromActno ,String toActno ,double money);

}

BankService 接口实现类

package com.qgs.service;

import com.qgs.dao.BankDao;

import com.qgs.pojo.Bank;

import jakarta.annotation.Resource;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

/**

* @author QGS

* @version 1.0.0

* @date 2023年03月25日 11:15:24

* @packageName com.qgs.service

* @className BankServiceImpl

* @describe TODO

*/

@Service("bankServiceImpl")

public class BankServiceImpl implements BankService{

   @Resource(name ="bankDao")

   private BankDao bankDao;

   @Override

   public void transfer(String fromActno, String toActno, double money) {

       //查询转出账户余额

       Bank fromBank = bankDao.selectByActno(fromActno);

       if (fromBank.getBalance()

           throw new RuntimeException("余额不足");

       }

       //查询转入账户余额

       Bank toBank = bankDao.selectByActno(toActno);

       //将内存中转出与转入账户余额修改

       fromBank.setBalance(fromBank.getBalance() - money);

       toBank.setBalance(toBank.getBalance() + money);

       //更新数据库

       int count = bankDao.update(fromBank);

       int count2 = bankDao.update(toBank);

       count +=count2;

       if (count !=2){

           //回滚事务,转账失败

           throw new RuntimeException("失败");

       }

   }

}


@Test

   public void BankTest(){

       ApplicationContext applicationContext =new ClassPathXmlApplicationContext("SpringConfig.xml");

       BankService bankService = applicationContext.getBean("bankServiceImpl", BankService.class);

       try {

           bankService.transfer("act01","act2",300);

           System.out.println("转账成功");

       }catch (Exception e){

           e.printStackTrace();

       }

   }


111.png


111.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
84 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
12天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
26 1
Spring高手之路24——事务类型及传播行为实战指南
|
5天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
13 3
|
2月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
210 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
2月前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
2月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
142 4
Spring事务传播机制(最全示例)
|
1月前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
29 2
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
2月前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
22 4