Spring5学习记录(四)声明式事务管理

Spring5学习记录(四)声明式事务管理

  • 一、事务管理
    • 1、事务四个特性ACID
    • 2、事务的两种方式
  • 二、基于注解实现声明式事务管理
    • 1、配置xml文件
    • 2、添加事务注解 ` @Transactional `
  • 三、声明式事务管理的参数配置
    • 1、propagation:事务传播行为
    • 2、isolation:事务隔离级别
    • 3、timeout:超时时间
    • 4、readOnly:是否只读
    • 5、rollbackFor:回滚
    • 6、noRollbackFor:不回滚
  • 四、完全注解实现声明式事务管理
    • 1、配置类:
    • 2、添加注解
  • 五、xml实现声明式事务管理

一、事务管理

事务是数据库操作最基本单位,要么都成功,要么都失败。典型场景:转账。

1、事务四个特性ACID

原子性,一致性,隔离性,持久性。

2、事务的两种方式

Spring事务管理有两种方式:编程式事务管理声明式事务管理,一般使用声明式事务管理,底层使用AOP原理

声明式事务管理有两种方式:基于xml配置方式 和 基于注解方式,一般使用注解方式。

Spring事务管理提供了一个接口,叫做事务管理器,这个接口针对不同的框架提供不同的实现类。

在这里插入图片描述
对于使用JdbcTemplate、MySQL进行数据库交互,使用DataSourceTransactionManager实现类,如果整合Hibernate框架则使用HibernateTransactionManager实现类,具体情况具体使用。

二、基于注解实现声明式事务管理

1、配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><context:component-scan base-package="com.atguigu.spring5"></context:component-scan><aop:aspectj-autoproxy></aop:aspectj-autoproxy><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="jdbc:mysql://localhost:3306/book" /><property name="username" value="root" /><property name="password" value="000000" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /></bean><!--创建JdbcTemplate对象--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!--注入数据库连接池--><property name="dataSource" ref="dataSource"></property></bean><!--创建事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启事务注解--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

2、添加事务注解 @Transactional

在service类上面或者service类的方法上面添加事务注解@Transactional

  • 如果把@Transactional添加在类上面,这个类里面所有方法都添加事务。
  • 如果只是添加在方法上面,则只为这个方法添加事务。
@Service  //ioc对象创建注解
@Transactional  //事务注解
public class UserService {......
}

三、声明式事务管理的参数配置

1、propagation:事务传播行为

事务传播可以理解为方法A调用方法B的过程中,如果方法A是由事务A提交的,那么需要考虑被方法A调用的方法B的事务是怎样的。
事务传播行为有7种,不是与数据库交互,数据库定义的,而是spring框架自带的,是spring通过aop实现的,下边是7种事务传播行为:

  • REQUIRED:如果当前没有事务,就新建一个事务。如果当前存在事务,则加入这个事务。
  • NESTED:如果当前没有事务,就新建一个事务。如果当前事务存在,则执行一个嵌套事务。
  • REQUIRES_NEW:如果当前没有事务,就新建一个事务。如果当前存在事务,把当前事务挂起,并且自己创建一个新的事务给自己使用。
  • SUPPORTS:如果当前没有事务,就以非事务方式执行。 如果当前有事务,则使用事务。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • MANDATORY:以事务方式执行,如果当前没有事务,就抛出异常。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

2、isolation:事务隔离级别

事务如果没有隔离的特性,会导致三个读数据问题:脏读,不可重复读,虚读(幻读)。

  • 脏读:一个未提交的事务读取到了另一个未提交事务的数据。

  • 不可重复读:事务A第一次读取数据,事务B对同一个表进行了update或delete(修改操作),事务A第二次读取数据,那么两次读取的数据是不同的,这时是不可重复读。

  • 幻(虚)读:事务A第一次读取数据,事务B对同一个表进行了insert(添加操作),事务A第二次读取数据,那么两次读取的数据是不同的,这时是幻读。
    在这里插入图片描述
    MySQL数据库默认可重复读。

3、timeout:超时时间

事务需要在一定时间内进行提交,超过时间后回滚。

  • 默认值是-1,设置时间以秒为单位。

4、readOnly:是否只读

  • 默认值为false,表示可以查询,也可以增删改。
  • 设置为true,只能查询。

5、rollbackFor:回滚

设置出现哪些异常进行事务回滚。

6、noRollbackFor:不回滚

设置出现哪些异常不进行事务回滚。

@Service
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)
public class AccountService {}

四、完全注解实现声明式事务管理

1、配置类:

@Configuration  //配置类
@ComponentScan(basePackages = "com.oymn.spring5")  //开启组件扫描
@EnableTransactionManagement  //开启事务
public class Config {//创建数据库连接池@Beanpublic DruidDataSource getDruidDataSource(){DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");druidDataSource.setUrl("jdbc:mysql://localhost:3306/book");druidDataSource.setUsername("root");druidDataSource.setPassword("000000");return druidDataSource;}//创建JdbcTemplate对象@Beanpublic JdbcTemplate getJdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}//创建事务管理器@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
}

2、添加注解

@Service
public class AccountService {@Autowiredprivate AccountDao accountDao;@Transactionalpublic void accountMoney(){accountDao.add();//int i=1/0;   //用来模拟转账失败accountDao.reduce();}
}

五、xml实现声明式事务管理

从xml实现声明式事务管理的配置文件来看,spring实现事务管理是通过AOP切面实现的。

<context:component-scan base-package="com.oymn"></context:component-scan><!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="jdbc:mysql://localhost:3306/book" /><property name="username" value="root" /><property name="password" value="000000" /><property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean><!--创建JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!--注入数据库连接池--><property name="dataSource" ref="dataSource"></property>
</bean><!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><!--配置事务通知-->
<tx:advice id="txadvice"><!--配置事务参数--><tx:attributes><tx:method name="accountMoney" propagation="REQUIRED" /></tx:attributes>
</tx:advice><!--配置切入点和切面-->
<aop:config><!--配置切入点--><aop:pointcut id="pt" expression="execution(* com.oymn.spring5.Service.*.*(..))"/><!--配置切面--><aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

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

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

相关文章

Linux上python离线安装教程

一. 安装Python 1. 下载python离线包 安装包下载地址&#xff1a;https://www.python.org/downloads/source/ 我下载的是Python 3.10.14 下面是linux服务器上的部署过程 2. 系统更新 sudo yum update -y 3. 安装必要的依赖项 sudo yum groupinstall “Development Tools” -y…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…

商场应急响应:SpringBoot技术优化

3系统分析 3.1可行性分析 通过对本大型商场应急预案管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大型商场应急预案管理系统采用SSM框架&#xff0…

WebSocket的理解与应用

WebSocket的理解与应用 一、是什么二、特点1、全双工2、二进制帧3、协议名4、握手5、优点 三、应用场景 一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达…

【C++ 算法进阶】算法提升八

复杂计算 &#xff08;括号问题相关递归套路 重要&#xff09; 题目 给定一个字符串str str表示一个公式 公式里面可能有整数 - * / 符号以及左右括号 返回最终计算的结果 题目分析 本题的难点主要在于可能会有很多的括号 而我们直接模拟现实中的算法的话code会难写 要考虑…

Node学习记录-until实用工具

来源&#xff1a;Nodejs 第十八章&#xff08;util&#xff09; util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格&#xff08;即最后一个参数为回调函数&#xff09;的函数转换成返回Promise的函数&#xff0c;这样可以使得异步代…

Vue生命周期

Vue生命周期&#xff1a;Vue实例从创建到销毁的过程&#xff0c;即指从创建、初始化数据、编译模板、挂载DOM到渲染、更新到渲染、销毁等一系列过程。主要分为创建前后、载入前后、更新前后、销毁前后以及一些特殊场景的生命周期。 …

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章

前言 10月22日原生鸿蒙之夜发布会宣布HarmonyOS NEXT正式发布&#xff0c;首个版本号&#xff1a;鸿蒙5.0。这次“纯血鸿蒙”脱离了底层安卓架构成为纯国产的独立系统&#xff0c;仅凭这一点就有很多想象空间。 目前鸿蒙生态设备已超10亿&#xff0c;原生鸿蒙操作系统在中国市…

联动香港、成都、武汉三所高校!“2024 深圳国际金融科技大赛”校园行圆满结束

在金融科技蓬勃发展的当下&#xff0c;人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设&#xff0c;向高校学子提供一个展示自身知识、能力和创意的平台&#xff0c;2024 FinTechathon 深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启&#xf…

【真题笔记】16年系统架构设计师要点总结

【真题笔记】16年系统架构设计师要点总结 存储部件接口嵌入式处理器产品配置配置管理用户文档系统文档CMM&#xff08;能力成熟度模型&#xff09;螺旋模型敏捷软件开发的方法学软件工具面向对象的分析模型设计模型COP&#xff08;面向构件的编程&#xff09;构件原子构件模块S…

【力扣打卡系列】二分查找(红蓝染色法)

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day8 在排序数组中查找元素的第一个和最后一个位置 题目描述解题思路 二分查找 注意勿漏循环&#xff0c;条件为left < right注意比较的是nums[mid]与target的值&#xff0c;不是mid注意if s…

NGINX 交叉编译 arm32

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

操作集成、数据集成、界面集成-系统架构师(八十八)

1软件开发环境由软件工具集和环境集成机制构成&#xff0c;前者支持软件活动的过程和任务&#xff0c;后者提供统一数据模式和数据接口规范的数据集成机制&#xff0c;支持个各开发活动之间通信、切换、调度和协同的&#xff08;&#xff09;。 A 操作集成机制 B 控制集成机制…

项目经理必看:PMP证书值不值得考?一文了解真相!

大部分人对“PMP证书”这个词语可能有点陌生&#xff0c;但很多想从事于项目管理或带团队当领导的人对此还是比较熟悉的。 PMP是由美国项目管理协会发起的&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试&#xff0c;1999年由我国国家外国专家局引进&am…

空元组同一空间,空列表不是同一空间print(a is b, c is d)

1. 在Python&#xff08;Python的官方实现&#xff09;中&#xff0c;对于小整数有一个整数缓存机制&#xff1a; - 整数对象在 -5到256&#xff08;包含 -5和256&#xff09;之间是被缓存的。这意味着在这个范围内的整数&#xff0c;当你在代码中多次使用相同的值创建整数对象…

电通旗下VeryStar连摘Campaign 亚太科技MVP及鼎革奖两项大奖

近日&#xff0c;电通CXM&#xff08;客户体验管理&#xff09;旗下费芮互动VeryStar开发的OmniRetail零售数字化平台及其中的OmniCRM分别摘得重磅奖项。OmniCRM在Campaign亚太2024年度亚太地区Tech MVP中当选“最有价值科技产品”&#xff0c;OmniRetail荣获“2024「鼎革奖」数…