Spring----------- 声明式事务

深入解析Vortex GPGPU cache设计(2),关于cache_bank 本文分析了Vortex处理器的cache_bank模块设计,作为cache系列的第二部分。文章详细阐述了cache_bank的基本结构,包括地址位分配和默认配置参数。重点解析了cache的5种操作及其优先级。文章详细介绍了二级流水线设计,包括TAG/DATARAM的读写操作时序。 阅读详情

 

  1. 事务概述

●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术。

●事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。

●事务的四个关键属性(ACID)

○原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。

○一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。

○隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。

○持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

 

  1. Spring事务管理
    1. 编程式事务管理

①使用原生的JDBC API进行事务管理

      [1]获取数据库连接Connection对象

      [2]取消事务的自动提交

      [3]执行操作

      [4]正常完成操作时手动提交事务

      [5]执行失败时回滚事务

      [6]关闭相关资源

②评价

      使用原生的JDBC API实现事务管理是所有事务管理方式的基石,同时也是最典型的编程式事务管理。编程式事务管理需要将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。在使用编程的方式管理事务时,必须在每个事务操作中包含额外的事务管理代码。相对于核心业务而言,事务管理的代码显然属于非核心业务,如果多个模块都使用同样模式的代码进行事务管理,显然会造成较大程度的代码冗余。

    1. 声明式事务管理

大多数情况下声明式事务比编程式事务管理更好:它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。

事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,进而借助Spring AOP框架实现声明式事务管理。

Spring在不同的事务管理API之上定义了一个抽象层,通过配置的方式使其生效,从而让应用程序开发人员不必了解事务管理API的底层实现细节,就可以使用Spring的事务管理机制。

Spring既支持编程式事务管理,也支持声明式的事务管理。

    1. Spring提供的事务管理器

Spring从不同的事务管理API中抽象出了一整套事务管理机制,让事务管理代码从特定的事务技术中独立出来。开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。

Spring的核心事务管理抽象是PlatformTransactionManager。它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务管理策略(编程式或声明式),事务管理器都是必须的。

事务管理器可以以普通的bean的形式声明在Spring IOC容器中。

    1. 事务管理器的主要实现

①DataSourceTransactionManager:在应用程序中只需要处理一个数据源,而且通过JDBC存取。

②JtaTransactionManager:在JavaEE应用服务器上用JTA(Java Transaction API)进行事务管理

③HibernateTransactionManager:用Hibernate框架存取数据库

  1. 测试数据准备
    1. 需求

    1. 数据库表

CREATE TABLE book (

  isbn VARCHAR (50) PRIMARY KEY,

  book_name VARCHAR (100),

  price INT

) ;

 

CREATE TABLE book_stock (

  isbn VARCHAR (50) PRIMARY KEY,

  stock INT,

  CHECK (stock > 0)

) ;

 

CREATE TABLE account (

  username VARCHAR (50) PRIMARY KEY,

  balance INT,

  CHECK (balance > 0)

) ;

 

INSERT INTO account (`username`,`balance`) VALUES ('Tom',100000);

INSERT INTO account (`username`,`balance`) VALUES ('Jerry',150000);

 

INSERT INTO book (`isbn`,`book_name`,`price`) VALUES ('ISBN-001','book01',100);

INSERT INTO book (`isbn`,`book_name`,`price`) VALUES ('ISBN-002','book02',200);

INSERT INTO book (`isbn`,`book_name`,`price`) VALUES ('ISBN-003','book03',300);

INSERT INTO book (`isbn`,`book_name`,`price`) VALUES ('ISBN-004','book04',400);

INSERT INTO book (`isbn`,`book_name`,`price`) VALUES ('ISBN-005','book05',500);

 

INSERT INTO book_stock (`isbn`,`stock`) VALUES ('ISBN-001',1000);

INSERT INTO book_stock (`isbn`,`stock`) VALUES ('ISBN-002',2000);

INSERT INTO book_stock (`isbn`,`stock`) VALUES ('ISBN-003',3000);

INSERT INTO book_stock (`isbn`,`stock`) VALUES ('ISBN-004',4000);

INSERT INTO book_stock (`isbn`,`stock`) VALUES ('ISBN-005',5000);

 

  1. 初步实现
    1. 配置文件

<!-- 配置事务管理器 -->

<bean id="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>    

</bean>

 

<!-- 启用事务注解 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

 

    1. 在需要进行事务控制的方法上加注解

@Transactional

  1. 事务的传播行为
    1. 简介

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。

事务传播属性可以在@Transactional注解的propagation属性中定义。

    1. 测试

    1. 说明

①REQUIRED传播行为

当bookService的purchase()方法被另一个事务方法checkout()调用时,它默认会在现有的事务内运行。这个默认的传播行为就是REQUIRED。因此在checkout()方法的开始和终止边界内只有一个事务。这个事务只在checkout()方法结束的时候被提交,结果用户一本书都买不了。

②REQUIRES_NEW传播行为

表示该方法必须启动一个新事务,并在自己的事务内运行。如果有事务在运行,就应该先挂起它。

    1. 补充

在Spring 2.x事务通知中,可以像下面这样在<tx:method>元素中设定传播事务属性。

 

  1. 事务的隔离级别
    1. 数据库事务并发问题

假设现在有两个事务:Transaction01和Transaction02并发执行。

①脏读

      [1]Transaction01将某条记录的AGE值从20修改为30。

      [2]Transaction02读取了Transaction01更新后的值:30。

      [3]Transaction01回滚,AGE值恢复到了20。

      [4]Transaction02读取到的30就是一个无效的值。

②不可重复读

      [1]Transaction01读取了AGE值为20。

      [2]Transaction02将AGE值修改为30。

      [3]Transaction01再次读取AGE值为30,和第一次读取不一致。

③幻读

      [1]Transaction01读取了STUDENT表中的一部分数据。

      [2]Transaction02向STUDENT表中插入了新的行。

      [3]Transaction01读取了STUDENT表时,多出了一些行。

    1. 隔离级别

数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

①读未提交:READ UNCOMMITTED

允许Transaction01读取Transaction02未提交的修改。

②读已提交:READ COMMITTED

         要求Transaction01只能读取Transaction02已提交的修改。

③可重复读:REPEATABLE READ

         确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。

④串行化:SERIALIZABLE

         确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

⑤各个隔离级别解决并发问题的能力见下表

 

脏读

不可重复读

幻读

READ UNCOMMITTED

有

有

有

READ COMMITTED

无

有

有

REPEATABLE READ

无

无

有

SERIALIZABLE

无

无

无

⑥各种数据库产品对事务隔离级别的支持程度

 

Oracle

MySQL

READ UNCOMMITTED

×

√

READ COMMITTED

√(默认)

√

REPEATABLE READ

×

√(默认)

SERIALIZABLE

√

√

 

    1. 在Spring中指定事务隔离级别

①注解

用@Transactional注解声明式地管理事务时可以在@Transactional的isolation属性中设置隔离级别

②XML

在Spring 2.x事务通知中,可以在<tx:method>元素中指定隔离级别

 

  1. 触发事务回滚的异常
    1. 默认情况

捕获到RuntimeException或Error时回滚,而捕获到编译时异常不回滚。

    1. 设置途经

①注解

@Transactional 注解

[1]rollbackFor属性:指定遇到时必须进行回滚的异常类型,可以为多个

[2]noRollbackFor属性:指定遇到时不回滚的异常类型,可以为多个

②XML

在Spring 2.x事务通知中,可以在<tx:method>元素中指定回滚规则。如果有不止一种异常则用逗号分隔。

  1. 事务的超时和只读属性
    1. 简介

由于事务可以在行和表上获得锁,因此长事务会占用资源,并对整体性能产生影响。

如果一个事务只读取数据但不做修改,数据库引擎可以对这个事务进行优化。

超时事务属性:事务在强制回滚之前可以保持多久。这样可以防止长期运行的事务占用资源。

只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务。

    1. 设置

①注解

@Transaction注解

 

②XML

在Spring 2.x事务通知中,超时和只读属性可以在<tx:method>元素中进行指定

 

  1. 基于XML文档的声明式事务配置

         <!-- 配置事务切面 -->

         <aop:config>

                   <aop:pointcut

                            expression="execution(* com.sirius.tx.component.service.BookShopServiceImpl.purchase(..))"

                            id="txPointCut"/>

                   <!-- 将切入点表达式和事务属性配置关联到一起 -->

                   <aop:advisor advice-ref="myTx" pointcut-ref="txPointCut"/>

         </aop:config>

        

         <!-- 配置基于XML的声明式事务  -->

         <tx:advice id="myTx" transaction-manager="transactionManager">

                   <tx:attributes>

                            <!-- 设置具体方法的事务属性 -->

                            <tx:method name="find*" read-only="true"/>

                            <tx:method name="get*" read-only="true"/>

                            <tx:method name="purchase"

                                     isolation="READ_COMMITTED"

         no-rollback-for="java.lang.ArithmeticException,java.lang.NullPointerException"

                                     propagation="REQUIRES_NEW"

                                     read-only="false"

                                     timeout="10"/>

                   </tx:attributes>

         </tx:advice>

 

华为OD机试真题 2026-9-2【查找幸运数】 华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。 阅读详情

相关推荐

uniapp 实现RFID识别的实战指南

本文提供了在uniapp中实现RFID识别的完整实战指南。核心在于通过Android系统广播机制,利用uni-app的plus对象调用原生接口,完成与RFID手持设备的“软硬件握手”。文章详细介绍了从环境准备、设备选型、核心代码实现到避坑优化的全流程,帮助开发者快速构建高效的RFID盘点或管理应用。

weixin_29161719的博客 407

java @Transactional事务 REQUIRES_NEW失效的原因分析

java @Transactional事务 REQUIRES_NEW失效的原因分析 REQUIRES_NEW:表示新建一个全新Session开启一个全新事务,如果当前存在事务,则把当前事务挂起。 既 a事务中包含b事务但是如果b事务执行完成之后发生异常a事务会进行回滚操作,b事务不会进行回滚,但是结果是都进行了回滚。 原因分析:其实并不是a事务进行了回滚,而是因为a,b事务操作了一张表,a发生回滚回滚至a事务刚开始的状态,即时b事务没有进行回滚,但是由于操作了同一张表,经过a的回滚还是会导致b对这样表的

weixin_42314051的博客 2493

别再卡在Google验证了!用Header Editor插件5分钟搞定TryHackMe注册(附最新.json规则)

本文提供了使用Header Editor插件快速解决TryHackMe注册时Google验证失败问题的详细指南。通过导入特定的JSON规则文件,用户可以轻松绕过网络限制,5分钟内完成账号注册,无需复杂设置。文章包含完整的配置步骤、常见问题解决方案以及安全使用建议。

weixin_30736301的博客 466

Spring时REQUIRED和REQUIRES_NEW 的区别

REQUIRED 假如当前正要执行的事务不在另外一个事务里,那么就起一个新的事务 比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.met...

脑壳疼 1685

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

极化码自适应CA-SCL译码(极化码译码)

我们知道最初极化码提出来是运用SC译码,但短码和中等长度其译码性(误码率)能不如LDPC码码,,为了提升有限长度极化码的译码性能,我们主要从译码器的性能和极化码的纠错性能来考虑。 SCL:在增加复杂度的情况下,大幅度增加极化码纠错性能,在高信噪比下,与最优ML性能相同(L=32) CA-SCL:改善最小汉明距离(最小汉明距离增大),增加其纠错性能。把CRC和极化码极联。 自适应CA-SCL:CA-SCL译码虽然提升几乎没的纠错性能,但是导致复杂度大幅度增加,为了降低其复杂度,让L自适应,从而降低其复杂度

m0_52610504的博客 3294

声明式事务

第08章声明式事务 1 事务概述 ●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术。 ●事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。 ●事务的四个关键属性(ACID) ○原子性(atomicity):“原子...

weixin_30673715的博客 276

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

[Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置

环境

Harry的博客 809

金融科技风险管理实践之监管评级全解

内部审计是公司治理的四大基石之一。因此,建议银行以问题与结果为导向,推动科技风险分级分类管理,重点防范重大中断、重大事件,并进一步加强科技风险评估与监测,加强对重要管理流程、重要系统、网络等重点管控环节的评估监测,对于评估发现的问题,及时完善管理手段,举一反三解决问题,提高风险管理的有效性。投入更多审计资源,加大对重点机构、薄弱环节、重要领域的审计力度,如:加强对境外机构的审计,加强网络安全、数据安全、业务连续性等高风险领域审计,加强数字化转型过程中的风险审计,以高水平安全,为数字金融高质量发展保驾护航。

银行信息系统应用架构详解 452

【AI智能体】Claude Code +Superpowers 项目实战操作详解

Claude Code +Superpowers 项目实战操作详解

congge 4053

Spring事务REQUIRES_NEW,REQUIRED【开启多线程,事务嵌套】

这种事务传播类型新创建的事务和被挂起的事务没有任何关系,他们是两个相互独立的事务,外部事务失败后回滚,不会回滚内部事务的执行结果,内部事务执行失败抛出异常,被外部事务捕获时,外部事务可以不处理内部事务的回滚操作。2.ServiceA使用REQUIRES、ServiceB使用REQUIRES_NEW,同样也是回滚ServiceA的以及ServiceB中有异常的(附图1),需要注意的是:这里回滚A是由于在A中使用了try catch才回滚,如果没有使用try chtch是不会回滚A的(附图2)。

qq_42196643的博客 4633

机器学习之多种算法优缺点总结及优化方法

一、无监督算法: 1、聚类算法:Kmeans 2、关联规则算法:Apriori 二、有监督算法 1、分类算法 决策树(Decision Tree) 支持向量机(SVM) K近邻(kNN,k-NearestNeighbor) 朴素贝叶斯 逻辑回归 2、回归算法 线性回归 多项式回归 3、集成算法 a、bagging(Bootstrapped Aggregation) 随机森林 ...

平原的博客 7081

Spring 声明式事务

本文介绍了声明式事务与编程式事务的区别及实现方式。编程式事务需手动编写事务控制代码,灵活性高但维护性差;声明式事务通过注解或配置实现,将事务控制与业务逻辑分离。重点讲解了Spring声明式事务的实现:1. 配置事务管理器和相关依赖;2. 使用@Transactional注解及其属性设置,包括只读(readOnly)、超时(timeout)、异常处理(rollbackFor/noRollbackFor)、隔离级别(isolation)和传播行为(propagation)。其中传播行为解决了嵌套事务的问题,并提

weixin_55837048的博客 1748

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

详解 spring 声明式事务(@Transactional)

spring事务有2种用法:编程式事务和声明式事务。 编程式事务上一篇文章中已经介绍了,不熟悉的建议先看一下编程式事务的用法。 这篇主要介绍声明式事务的用法,我们在工作中基本上用的都是声明式事务,所以这篇文章是比较重要的,建议各位打起精神,正式开始。 什么是声明式事务? 所谓声明式事务,就是通过配置的方式,比如通过配置文件(xml)或者注解的方式,告诉spring,哪些方法需要spring帮忙管理事务,然后开发者只用关注业务代码,而事务的事情spring自动帮我们控制。 比如注解的方式,只需在方法

Purpletaro的专栏 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Spring 事务详解】声明式事务概念

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

鱼干的博客 3897

Spring声明式事务

本文介绍Spring中的声明式事务。Spring声明式事务是通过AOP进行实现的。

孙小鸿的博客 1063

Spring的事务管理 - 声明式事务

基于Spring AOP实现。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。编程式事务管理使用可实现更细粒度的事务控制。声明式事务管理不需要入侵代码,通过就可以进行事务操作,更快捷而且简单且大部分业务都可以满足,推荐使用。其实不管是编程式事务还是声明式事务,最终调用的底层核心代码是一致的。

埃泽漫笔 1556

spring声明式事务

spring声明式事务

时光 2933

spring声明式事务原理刨析

spring声明式事务原配刨析

qq_43581846的博客 2310

【Spring】Spring 事务之声明式事务

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

lucashu的博客 825

Spring的声明式事务底层原理

文章目录声明式事务的概述声明式事务的初探声明式事务的源码分析 声明式事务的概述 Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事...

蓝田日暖玉生烟 8834
上一篇: Spring-----JdbcTemplate
下一篇: SpringMVC ----@RequestMapping映射
HelloWorld_AA
博客等级 码龄9年 18粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值