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

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 事物:在一个业务流程中,通常需要多条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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
SQL Java 关系型数据库
Spring事务传播机制:7种姿势教你玩转"事务接力赛"
事务传播机制是Spring框架中用于管理事务行为的重要概念,它决定了在方法调用时事务如何传递与执行。通过7种传播行为,开发者可以灵活控制事务边界,适应不同业务场景。例如:REQUIRED默认加入或新建事务,REQUIRES_NEW独立开启新事务,NESTED支持嵌套回滚等。合理使用传播机制不仅能保障数据一致性,还能提升系统性能与健壮性。掌握这“七种人格”,才能在复杂业务中游刃有余。
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3072 1
|
Java Spring
Spring中事务失效的场景
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时, 那么这个注解才会⽣效 , 如果使用的是被代理对象调用, 那么@Transactional会失效 同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现 的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效 如果在业务中对异常进行了捕获处理 , 出现异常后Spring框架无法感知到异常, @Transactional也会失效
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
385 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1764 0
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
336 0
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
891 0
|
8月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
1123 1
|
11月前
|
人工智能 Java 数据库连接
Spring事务失效场景
本文深入探讨了Spring框架中事务管理可能失效的几种常见场景及解决方案,包括事务方法访问级别不当、方法内部自调用、错误的异常处理、事务管理器或数据源配置错误、数据库不支持事务以及不合理的事务传播行为或隔离级别。通过合理配置和正确使用`@Transactional`注解,开发者可以有效避免这些问题,确保应用的数据一致性和完整性。
1001 10
|
10月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
754 1