Spring 事务管理 @Transactional

news2024/11/14 17:53:26

事务

Spring 的声明式事务是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。

事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可。

在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。

Spring 声明式事务控制底层就是AOP。

XML方式

  1. 引入tx命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
  1. 配置事务增强
<!--平台事务管理器-->
<bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!--事务增强配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>
  1. 配置事务 AOP 织入
<!--事务的aop增强-->
<aop:config>
    <aop:pointcut id="myPointcut" 
        expression="execution(* com.qaomuu.service.impl.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
  1. 测试事务控制转账业务代码
@Override
public void transfer(String outMan, String inMan, double money) {
    accountDao.out(outMan,money);
    int i = 1/0;
    accountDao.in(inMan,money);
}

<tx:method>

代表切点方法的事务参数的配置

<tx:method name="transfer" isolation="REPEATABLE_READ" 
        propagation="REQUIRED" timeout="-1" read-only="false"/>

参数:

  • name:切点方法名称
  • isolation:事务的隔离级别
  • propogation:事务的传播行为
  • timeout:超时时间
  • read-only:是否只读

注解方式

@EnableTransactionManagement:设置当前Spring环境中开启注解式事务支持

@Transactional:为当前业务层方法添加事务(如果设置在类或接口上方所有方法均添加事务)

属性:

  • readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true。

  • timeout:设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超时时间。

  • rollbackFor:当出现指定异常进行事务回滚

  • noRollbackFor:当出现指定异常不进行事务回滚,Spring的事务只会对Error异常RuntimeException异常及其子类进行事务回滚,其他的异常类型不会回滚

  • rollbackForClassName:等同于rollbackFor,属性为异常的类全名字符串

  • noRollbackForClassName:等同于noRollbackFor,属性为异常的类全名字符串

  • isolation:设置事务的隔离级别

    • DEFAULT:默认隔离级别, 会采用数据库的隔离级别
    • READ_UNCOMMITTED:读未提交
    • READ_COMMITTED:读已提交
    • REPEATABLE_READ:重复读取
    • SERIALIZABLE:串行化
  • propagation:设置事务的传播行为

七种不同传播特性的介绍

REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务

  • 如果a方法有事务 则不管b方法有无事务 都加入a的事务
  • 如果a方法没有事务,则b方法新建一个事务(事务仅仅对b方法有效)

SUPPORTS:当前存在事务(a),则加入当前事务(b加入),如果当前没有事务(a),则以非事务的方式执行(整个a方法)

MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起改事务

  • 若a方法有事务,则b方法创建一个事务,挂起a方法的事务。
  • 若a方法没有事务,那b方法还是创建一个事务。那也就是和上面那句一样了执行效果

NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务

  • 若a方法有事务,则a方法的事务挂起,
  • 如果a方法没有事务,那就没有事务咯

NEVER:不使用事务,如果当前事务存在,则抛出异常

NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样

image

  1. 编写 AccoutDao
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void out(String outMan, double money) {
        jdbcTemplate.update("update account set money=money-? where name=?",
            money, outMan);
    }
    
    public void in(String inMan, double money) {
        jdbcTemplate.update("update account set money=money+? where name=?",
            money, inMan);
    }
}
  1. 编写 AccoutService
@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;

    @Transactional(isolation = Isolation.READ_COMMITTED,
        propagation = Propagation.REQUIRED)
    public void transfer(String outMan, String inMan, double money) {
        accountDao.out(outMan,money);
        int i = 1/0;
        accountDao.in(inMan,money);
    }
}
  1. 编写 applicationContext.xml 配置文件
<!--之前省略datsSource、jdbcTemplate、平台事务管理器的配置-->
<!--组件扫描-->
<context:component-scan base-package="com.qaomuu"/>
<!--事务的注解驱动-->
<tx:annotation-driven/>
  1. 使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。
  2. 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
  3. 使用在方法上,不同的方法可以采用不同的事务参数配置。
  4. Xml配置文件中要开启事务的注解驱动<tx:annotation-driven />

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…

2024年南京等保测评机构名单看这里!

时光流逝&#xff0c;已经到了2024年。不少小伙伴在问&#xff0c;2024年南京等保测评机构有哪些&#xff1f;跟2023年一样吗&#xff1f;这里我们小编就给大家汇总了一下&#xff0c;具体地址以及名称看这里就可以啦&#xff01; 2024年南京等保测评机构名单看这里&#xff0…

将TI的电量计Linux驱动从4.4内核移植到5.10

背景 最近公司某产品用到了TI的电量计芯片BQ40Z50&#xff0c;我负责为其开发Linux驱动&#xff0c;搜了下&#xff0c;github上有TI为其写好的开源驱动&#xff0c;太好了。 看了下代码&#xff0c;比较简单&#xff0c;连Makefile都没写&#xff0c;不过这也挺好&#xff0…

超高质量的 8个免费设计素材网站,设计师必备。

设计师一般都去哪里找素材&#xff1f;找高质量且免费的设计素材&#xff0c;就上这8个网站&#xff0c;平面、UI、电商等设计素材都能找到&#xff0c;赶紧收藏一波~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内…

第十三章 MySQL

第十三章 MySQL 下面是创建数据库操作 删除数据库 右上角选择要操作的数据库 如果关闭了这个控制台&#xff0c;下次如何找到它呢 也可以对其改名

C++类包含编译模型实战

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序&#xff0c;查看结果 &#xff08;二&#xff09;C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

Leetcode 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

中使用 MOOTDX库读取通达信的数据,WIN+PYTHON,最新问题排查

M项目概述 - MOOTDXhttps://www.mootdx.com/zh-cn/latest/帮助文档https://www.mootdx.com/zh-cn/latest/​​​​​​​​​​​​​​​​​​​​​ 库的安装 注&#xff1a;我这的安装过程必须要ROOT权限&#xff0c;所以我用管理员的权限运行了控制台 pip install moot…

OCR识别网络CRNN理解与Pytorch实现

CRNN是2015年的论文“An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition”提出的图像字符识别网络&#xff0c;也是目前工业界使用较为广泛的一个OCR网络。论文地址&#xff1a;https://arxiv.org/…

SCI好看的配图-汇总

文章目录 图源&#xff1a;Sustainable Cities and Society【期刊】条形图2热力图-地图 图源&#xff1a;Sustainable Cities and Society【期刊】 引自&#xff1a;A machine learning-driven spatio-temporal vulnerability appraisal based on socio-economic data for COV…

【Vue】使用 Vuex 作为状态管理

【Vue】使用 Vuex 作为状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它使用单一状态树&#xff0c;这意味着这个对象包含了全部的应用层级状态&#xff0c;并且以一种相对集中的方式存在。这也意味着&#xff0c;通常单个项目中只有一个 Vuex store。Vue…

AI大模型开发架构设计(2)——AI绘画技术架构应用实践

文章目录 1 AI绘画整体流程2 AI绘画技术架构文生图核心算法原理文生图工程架构 3 AI绘画的应用实践 1 AI绘画整体流程 第一步&#xff1a;输入 Prompt 提示词&#xff1a;/mj 提示词第二步&#xff1a;文生图(Text-to-Image)构图第三步&#xff1a;图片渲染第四步&#xff1a;…

代码里下毒了,支付下单居然没加幂等

又是一个风和日丽没好的一天&#xff0c;小猫戴着耳机&#xff0c;安逸地听着音乐&#xff0c;撸着代码&#xff0c;这种没有会议的日子真的是巴适得板。 不料祸从天降&#xff0c;组长火急火燎地跑过来找到了小猫。“快排查一下&#xff0c;目前有A公司用户反馈积分被多扣了”…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

100天精通鸿蒙从入门到跳槽——第8天:TypeScript 知识储备:泛型

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站&#xff0c;通过信息收集插件wappalyzer&#xff0c;发现ZABBIX-监控系统&#xff1a; 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了…

nginx配置内网代理,前端+后端分开配置

安装好后nginx&#xff0c;进入配置文件 我这块安装在了home里面&#xff0c;各位根据自身情况选择 打开nginx.conf文件 在底部查看是否包含这段信息&#xff1a;含义是配置文件包含该路径下的配置文件 include /home/nginx/conf/conf.d/*.conf; # 该路径根据自己的安装位置…

【从0到1学Python】第二讲:Python中的各种“量”(一)

也许你知道学习一门语言的第一件事就是在屏幕上输出"Hello world!"。 但是请别着急&#xff01;在本系列文章中&#xff0c;我希望在讲如何输出之前&#xff0c;先谈谈Python中的各种量。因为&#xff0c;输出、输入语句也是基于各种“量”来完成的。我想&#xff0c…

基于springboot+vue的宠物领养系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景及意…