Spring事务总结

Spring 本地事务 Spring 本地事务、Spring 事务的传播行为、本地事务失效分析 阅读详情

1 什么是事务

1 保证一组操作,要么全部成功,要么全部失败

2 事务的特性

提到事务特性,肯定会想起ACID特性.

原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

一致性(Consistency): 执行事务前后,数据保持一致;

隔离性(Isolation): 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;

持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

3 Spring 中事务

在Spring中,事务抽象的关键接口是org.springframework.transaction.PlatformTransactionManager.

PlatformTransactionManager 的主要实现类大致如下:

  • DataSourceTransactionManager:适用于使用JDBC和iBatis进行数据持久化操作的情况。
  • HibernateTransactionManager:适用于使用Hibernate进行数据持久化操作的情况。
  • JpaTransactionManager:适用于使用JPA进行数据持久化操作的情况。
  • 另外还有JtaTransactionManager 、JdoTransactionManager、JmsTransactionManager等等。

TransactionDefinition接口:定义事务信息(事务隔离,传播特性,超时,只读状态)

定义的主要属性(虽然spring官方文档只定义了三种传播特性,但是代码中是有七种特性):

TransactionStatus接口: 为事务提供了一种简单的方法来控制事务执行和查询事务状态

定义的主要方法:

4 Spring事务的传播特性

Spring共支持7种传播行为:

PROPAGATION_REQUIRED:如果当前存在事务,就用当前事务;如果当前没有事务,则创建一个新的事务。是Spring默认的传播行为。
PROPAGATION_REQUIRES_NEW:创建一个新的事务,无论是否有事务
PROPAGATION_SUPPORTS: 事务可有可无
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY:当前如果存在事务,则加入该事务;当前没有事务,则抛出异常。(强制性)
PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价PROPAGATION_REQUIRED。嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。

5 Spring中的事务隔离级别

6 spring事务使用

工具:IDEA2018 ,

环境说明:spring boot(2.1.7),jdk1.8

在spring 是事务主要使用方式有两种。

1 编程式事务

    用过 Hibernate 的人都知道,我们需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

Spring Framework提供了两种编程式事务管理方法:

  • 使用TransactionTemplate。
  • PlatformTransactionManager使用.

TransactionTemplate 使用如下:

  @Autowired
    private TransactionTemplate transactionTemplate;
    /**
     * 使用手动事务管理
     */
    private void handTransaction() {

        //如果没有返回值可以使用TransactionCallbackWithoutResult
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                jdbcTemplate.execute("INSERT  into cat(name ) values('黑猫')");
                log.info("查询是否插入黑猫:{}", getCount());
                transactionStatus.setRollbackOnly();
            }
        });
        log.info("查询是否插入黑猫:{}", getCount());


        //如果有返回值可以使用TransactionCallback
       Object obj= transactionTemplate.execute(new TransactionCallback(){

            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                jdbcTemplate.execute("INSERT  into cat(name ) values('黑猫')");
                log.info("查询是否插入黑猫:{}", getCount());
                transactionStatus.setRollbackOnly();
                return 1;
            }
        });
       log.info("返回值:{}",obj);
    }

PlatformTransactionManager使用

2 声明式事务

Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

简单创建一个spring boot项目

上面我使用h2一个内存数据库

package com.example.demo03;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.annotation.Resource;

@SpringBootApplication
@Slf4j
public class Demo03Application implements CommandLineRunner {

    @Resource
    private CatService catService;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(Demo03Application.class, args);
    }

    /**
     * spring boot容器开启后,会自动运行run方法
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        initDatasource();
    }

    /**
     * 记录下当前使用事务管理器
     */
    private void initDatasource(){
        DataSourceTransactionManager txManager = new DataSourceTransactionManager(jdbcTemplate.getDataSource());

        log.info("事务:{}",txManager);
    }
}

上面代码验证了下当前使用事务管理器

下面一个service验证下@Transactional使用,下面是我的项目结构

CatService代码:

/**
 * @author 疯信子
 * @version 1.0
 * @date 2019/8/9.
 */
public interface CatService {
    public void insertCat() throws MyException;

    public void insertCatMany();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author 疯信子
 * @version 1.0
 * @date 2019/8/9.
 */
@Component
public class CatServiceImpl implements CatService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     *
     */
    @Override
    @Transactional
    public void insertCat() throws MyException {


        jdbcTemplate.execute("insert  into cat(name) values ('黑猫')");
        throw new MyException();

    }

    @Override
    public void insertCatMany() {

    }
}

@Transactional  默认属性:

 1 传播设置是 PROPAGATION_REQUIRED.

 2 隔离级别是 ISOLATION_DEFAULT.

3所有RuntimeException触发器回滚,任何检查Exception都不会回滚

如果需要回滚对应Excepiton事务可以在@Transactional使用 rollbackFor

Spring  官网文档暂时只介绍三种事务传播特性(required,requires_new,nested)。 实际是有7种事务传播特性.

代码如下

   /**
     *
     */
    @Override
    @Transactional
    public void insertCat() throws MyException {
        try {
            jdbcTemplate.execute("insert  into cat(name) values ('黑猫')");
            throw new MyException();
        } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }

    }

    @Override
    public void insertCatMany() {

        try {
            insertCat();
          //  catService.insertCat();
        } catch (MyException e) {
            log.error("系统异常", e);

        }

    }
}

 事务常见的错误:

一 No transaction aspect-managed TransactionStatus in scope

出现这个错误的原因是:

在于AOP的实现原理。由于@Transactional 的实现原理是AOP,AOP的原理是动态代理,换句话说,自调用时不存在代理对象的调用,这时不会产生我们注解@Transactional 配置的参数,自然无效了。

解决方案有一下两种

1 在没有@Transactional  通过注入servcie

2在insertCatMany方法中添加@Transactional注解

二 Transaction rolled back because it has been marked as rollback-only

 

而fooService里写的代码如下:

这里导致的问题,事务的嵌套,FooService.insertFoo()使用默认的传播特性(PROPAGATION_REQUIRED)导致.

PROPAGATION_REQUIRED具体意思可以参考上面说明

要想解决这个问题,可以直接修改传播特性为PROPAGATION_REQUIRES_NEW。这样就是嵌套的代码回滚,而外面的代码不回滚。

以上是关于spring事务的思考

 

Spring事务和MySQL事务详解面试 文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTEDSpring事务的隔离级别Spring 阅读详情

相关推荐

ComfyUI节点流实战:用Wan2.1制作电商短视频全流程(附人物/商品模板)

本文提供了一份详尽的ComfyUI实战教程,指导用户如何利用通义万相Wan2.1图生视频模型,高效制作适用于抖音等平台的电商短视频。内容涵盖从环境部署、核心工作流搭建,到针对服装、3C数码等品类的高级提示词模板与参数调优,旨在帮助电商从业者快速生成高质量、高保真商品展示视频,显著提升内容生产效率。

potato的博客 1284

spring事务管理

spring管理事务有两种声明式与编程式事务管理 编程式事务管理:基于 TransactionTemplate 的编程式事务管理:如下代码示例:public class BankServiceImpl implements BankService { private BankDao bankDao; private TransactionTemplate transactionTemplate; ...

qq_40874078的博客 399

2025年最新Cesium学习示例:Cesium-Examples

2025年最新Cesium学习示例:Cesium-Examples

2403_88103571的博客 1011

事务 还有这些用法,之前都不知道

序transationTemplate.execute 的写法 第一次 碰到,我之前是 controller -> biz -> service -> mapper 然后用 @Transation 注解搞定事务,至于 同一个类的 方法之间调用,在biz 层就规避了。

Huangjiazhen711的博客 893

排查单片机不工作的‘玄学’故障:从LDO选型、复位电路到焊接不良的完整避坑指南

本文深入剖析单片机不工作的常见硬件故障,从LDO选型、复位电路设计到PCB布局和焊接工艺,提供系统性排查方法。重点分析3.3V电源稳定性、LDO动态响应特性及复位电路设计要点,帮助工程师快速定位和解决嵌入式系统中的'玄学'故障,提升产品可靠性。

weixin_30655569的博客 389

别再到处找资源了!WinCC 7.5 SP2官方下载与Windows 10保姆级安装避坑指南

本文提供了WinCC 7.5 SP2在Windows 10上的官方下载与安装全流程指南,重点解决了资源获取难、系统兼容性问题及分卷压缩处理等常见痛点。通过详细的步骤和实用技巧,帮助用户顺利完成安装并优化配置,适用于工控领域的学习者和从业者。

weixin_32924297的博客 496

spring 编程式事务和声明式事务

1、编程式事务:TransactionTemplate transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transa...

qq_36614280的博客 357

adams案例分析_案例1(麦弗逊悬架子系统创建)

本文字数3292字83图,建议阅读时间26分钟首先看下案例1的麦弗逊悬架数模结构就不细讲了,从数模上主要是获取硬点坐标(铰接点、安装点、参考点)及大部件结构(副车架、摆臂、转向节等实际运动过程中会产生变形的部件,在ADAMS Car中我们就可以用柔性体来搭建)再来回顾下上一篇讲到的模型元素1、Hardpoint——硬点(只有位置没有方向)2、Parameter Variable——参数...

weixin_39609407的博客 6478

spring事务管理及失效场景

一、编程式事务 需要手动编程来实现事务,粒度可以控制到代码块级别 (1)原始事务管理方式 关键的三个接口:TransactionDefinition、PlatformTransactionManager、TransactionStatus 1、TransactionDefinition(事务定义接口) 默认实现类是DefaultTransactionDefinition。用于定义一个事务的静态属性。比如事务的传播行为、超时时间等。可以自定义类实现Transactiondefinition接口。

sumengnan的博客 619

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用DynamicConv高效动态卷积改进YOLO26检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

YOLO26作为新一代轻量化目标检测模型的代表,凭借精简的Backbone架构、高效的特征融合 Neck 设计,在实时检测场景(如嵌入式设备、边缘计算)中展现出优异的性能,成为工业落地与科研入门的优选模型。但在实际应用中,YOLO26原生检测头仍存在核心瓶颈:采用固定参数卷积核,无法根据输入特征的目标尺度、纹理差异动态调整卷积权重,导致多尺度目标适配不足、复杂背景下特征利用率低,且传统改进方案往往难以平衡“精度提升”与“轻量化”,要么精度提升有限,要么大幅增加参数量、拖累推理速度。

qq_36130719的博客 375

图像算法中的 Blob 分析

在计算机视觉中,Blob 可以理解为在图像中具有相似性质(如颜色、亮度等)的像素群体。Blob 通常用作基本单元,在图像分析和处理任务中能够提取出有意义的特征。

m0_44975814的博客 2483

spring事务

声明式事务管理使用注解或 XML 配置,将事务管理的关注点从业务逻辑中分离出来,更加简洁易用。编程式事务管理允许在代码中显式地控制事务边界,适用于需要动态控制事务的场景,但增加了代码的复杂性。

qq_53793319的博客 856

STM32F103C8T6驱动DHT11温湿度传感器程序

本程序基于 STM32F103C8T6 微控制器,通过 GPIO 模拟单总线通信时序实现对 DHT11 温湿度传感器的数据采集,主机采用拉低数据线的方式触发传感器启动,并通过检测高电平持续时间区分逻辑“0”和“1”,依次读取湿度和温度的整数数据及校验位,经过校验后将有效结果存入缓存数组,实现对环境温湿度的周期性测量与处理。

加斯顿工程师的博客 201

【Spring】Spring事务和事务传播机制

Spring事务和事务传播机制

2403_87459748的博客 2837

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring之事务详解

1.Spring事物的定义: 事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。 如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。 当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。 由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。 2. spring七个事务传播属性: PROP......

上善若泪 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring事务

spring事务

chenchenchencl的博客 2188

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

点击蓝色“程序员DMZ ”关注我哟 好看记得加个“星标”哈! 前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事务专题的收尾篇,也是我Spring源码专题的收尾篇。 本文大纲如下: Spring事务应用大纲 在看这篇文章,以及下篇源码分析的文章我希望你对Spring AOP以及有充分的了解,不然一些细节问题你可能看不明白,关于Spring AOP如果

做一个认真的程序员 3073

Spring 事务详解

上一章我们介绍了Spring AOP,今天来讲解Spring事务什么是事务?为什么需要事务?Spring 中事务的实现1.编程式事务2.声明式事务@Transactional详解1. REQUIRED(默认值)3.NEVER4.Nested如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,讲解的内容我会搭配我的理解用我自己的话去解释如果有什么问题的话,欢迎各位评论纠正 🤞🤞🤞N_0050-优快云博客java SE_N_0050的博客-优快云博客。

N_0050的博客 2825

Spring事务和事务传播机制

本章介绍了Spring 事务与事务传播机制,与MySQL中的事务有相同之处,也有不同之处

matexiang的博客 1954

【Spring框架】Spring事务的原理

本文将详细讲解Spring事务管理地底层原理,让你彻底搞懂Spring事务的运行机制。

小七的博客 3294

【Spring】事务总结

事务是逻辑上的一组操作,要么都执行,要么都不执行。Guide 哥:大家应该都能背上面这句话了,下面我结合我们日常的真实开发来谈一谈。我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为myisam,那么程序也就不再支持事务了!

2301_79456272的博客 1268

Spring 事务

⽐如有两个⽅法A, B都被修饰, A⽅法调⽤B⽅法A⽅法运⾏时, 会开启⼀个事务. 当A调⽤B时, B⽅法本⾝也有事务, 此时B⽅法运⾏时, 是加⼊A的事务, 还是创建⼀个新的事务呢?这样就涉及到了事务传播机制.事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题⽽事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题。

weixin_74744611的博客 730

【Spring事务】

Spring事务是对数据库事务的封装,确保逻辑工作单元的一系列操作要么全部成功,要么全部失败。事务具有四大特性:原子性、一致性、隔离性和持久性。Spring事务通过PlatformTransactionManager实现事务的提交和回滚,支持多种隔离级别(如读未提交、读已提交、可重复读、串行化)和传播行为(如REQUIRED、SUPPORTS、REQUIRES_NEW等)。此外,Spring事务允许自定义回滚规则、设置只读事务、以及通过编程式和声明式两种方式管理事务。声明式事务通过AOP实现,配置灵活且不侵

qq_46005538的博客 1237
上一篇: nginx root和alias说明
下一篇: linux 安装MySql 5.7.25 操作步骤
疯信子To
博客等级 码龄14年 12粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值