Spring框架的事务管理

简介: Spring框架的事务管理

事务的基础概念



  1. 事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败!


  1. 事务的特性 :原子性、 一致性 、隔离性、持久性


  1. 如果不考虑隔离性,引发安全性问题

读问题:
脏读:
不可重复读:
虚读:
写问题:
丢失更新:


  1. 如何解决安全性问题
    读问题解决,设置数据库隔离级别
    写问题解决可以使用 悲观锁和乐观锁的方式解决


Spring框架的事务管理相关的类和API



  1. PlatformTransactionManager接口
    -- 平台事务管理器.(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类!


  1. TransactionDefinition接口
    -- 事务定义信息.(事务的隔离级别,传播行为,超时,只读)


  1. TransactionStatus接口
    -- 事务的状态


  1. 总结:上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中


  1. PlatformTransactionManager接口中实现类和常用的方法
  2. 接口的实现类


如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类
如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类


  1. 该接口的常用方法


void commit(TransactionStatus status)
TransactionStatus getTransaction(TransactionDefinition definition)
void rollback(TransactionStatus status)


  1. TransactionDefinition
  2. 事务隔离级别的常量


static int ISOLATION_DEFAULT                  -- 采用数据库的默认隔离级别
static int ISOLATION_READ_UNCOMMITTED
static int ISOLATION_READ_COMMITTED
static int ISOLATION_REPEATABLE_READ
static int ISOLATION_SERIALIZABLE


  1. 事务的传播行为常量(不用设置,使用默认值)


  • 先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!
  • PROPAGATION_REQUIRED(默认值) -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!
  • PROPAGATION_SUPPORTS          -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.
  • PROPAGATION_MANDATORY         -- A中有事务,使用A中的事务.如果A没有事务.抛出异常.
  • PROPAGATION_REQUIRES_NEW(记)-- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)
  • PROPAGATION_NOT_SUPPORTED     -- A中有事务,将A中的事务挂起.
  • PROPAGATION_NEVER             -- A中有事务,抛出异常.
  • PROPAGATION_NESTED(记)     -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)


Spring框架的事务管理之编程式的事务管理



  1. 说明:Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可!!


  1. 手动编程方式的具体步骤如下:


  2.1. 步骤一:配置一个事务管理器,Spring使用PlatformTransactionManager接口来管理事务,所以咱们需要使用到他的实现类!!

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

2.2 步骤二:配置事务管理的模板
        <!-- 配置事务管理的模板 -->

<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
                <property name="transactionManager" ref="transactionManager"/>
            </bean>

2.3步骤三:在需要进行事务管理的类中,注入事务管理的模板.

<bean id="accountService" class="com.demo1.AccountServiceImpl">
                <property name="accountDao" ref="accountDao"/>
                <property name="transactionTemplate" ref="transactionTemplate"/>
            </bean>


2.4.步骤四:在业务层使用模板管理事务:

// 注入事务模板对象
            private TransactionTemplate transactionTemplate;
            public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
                this.transactionTemplate = transactionTemplate;
            }
            public void pay(final String out, final String in, final double money) {
                transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                    protected void doInTransactionWithoutResult(TransactionStatus status) {
                        // 扣钱
                        accountDao.outMoney(out, money);
                        int a = 10/0;
                        // 加钱
                        accountDao.inMoney(in, money);
                    }
                });
            }


Spring框架的事务管理之声明式事务管理,即通过配置文件来完成事务管理(AOP思想)



  1. 声明式事务管理又分成两种方式
    基于AspectJ的XML方式
    基于AspectJ的注解方式


Spring框架的事务管理之基于AspectJ的XML方式


1.引入AOP的开发包


  1. 步骤二配置事务管理器


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


  1. 步骤四:配置事务增强

<!-- 配置事务增强 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!--
                    name        :绑定事务的方法名,可以使用通配符,可以配置多个。
                    propagation :传播行为
                    isolation   :隔离级别
                    read-only   :是否只读
                    timeout     :超时信息
                    rollback-for:发生哪些异常回滚.
                    no-rollback-for:发生哪些异常不回滚.
                 -->
                <!-- 哪些方法加事务 -->
                <tx:method name="pay" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>


  1. 步骤五:配置AOP的切面

<!-- 配置AOP切面产生代理 -->
        <aop:config>
            <aop:advisor advice-ref="myAdvice" pointcut="execution(* com.itheima.demo2.AccountServiceImpl.pay(..))"/>
        </aop:config>
        * 注意:如果是自己编写的切面,使用<aop:aspect>标签,如果是系统制作的,使用<aop:advisor>标签


  1. 步骤六:编写测试类

@RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration("classpath:applicationContext2.xml")
        public class Demo2 {
            @Resource(name="accountService")
            private AccountService accountService;
            @Test
            public void run1(){
                accountService.pay("冠希", "美美", 1000);
            }
        }


Spring框架的事务管理之基于AspectJ的注解方式



1.配置事务管理器

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


2.开启注解事务

<!-- 开启注解事务 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>


  1. 步骤四:在业务层上添加一个注解:@Transactional


  1. 编写测试类

@RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration("classpath:applicationContext3.xml")
        public class Demo3 {
            @Resource(name="accountService")
            private AccountService accountService;
            @Test
            public void run1(){
                accountService.pay("冠希", "美美", 1000);
            }
        }


相关文章
|
29天前
|
Java Spring
Spring中事务失效的场景
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时, 那么这个注解才会⽣效 , 如果使用的是被代理对象调用, 那么@Transactional会失效 同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现 的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效 如果在业务中对异常进行了捕获处理 , 出现异常后Spring框架无法感知到异常, @Transactional也会失效
|
28天前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
39 0
|
28天前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
78 0
|
28天前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
26 0
|
5天前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
60 14
|
9天前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
115 11
|
2月前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
98 21
Spring框架初识
|
29天前
|
SQL Java 数据库连接
Spring中的事务是如何实现的
1. Spring事务底层是基于数据库事务和AOP机制的 2. ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean 3. 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解 4. 如果加了,那么则利⽤事务管理器创建⼀个数据库连接 5. 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮ 常重要的⼀步 6. 然后执⾏当前⽅法,⽅法中会执⾏sql 7. 执⾏完当前⽅法后,如果没有出现异常就直接提交事务 8. 如果出现了异常,并且这个异常是需要回滚的就会回滚事务
|
1月前
|
JavaScript Java 开发者
Spring事务失效,常见的情况有哪些?
本文总结了Spring事务失效的7种常见情况,包括未启用事务管理功能、方法非public类型、数据源未配置事务管理器、自身调用问题、异常类型错误、异常被吞以及业务和事务代码不在同一线程中。同时提供了两种快速定位事务相关Bug的方法:通过查看日志(设置为debug模式)或调试代码(在TransactionInterceptor的invoke方法中设置断点)。文章帮助开发者更好地理解和解决Spring事务中的问题。
|
2月前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
157 10