目录

1 声明式事务管理的注解实现

2 Transactional事务的参数配置

2.1 propagation:事务传播行为

2.2 ioslation:事务隔离级别

2.3 timeout:超时时间

2.4 readOnly:是否只读

2.5 rollbackFor:回滚

2.6 noRollbackFor:不回滚

3 声明式事务管理的XML实现

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


在 Spring 进行事务管理操作有两种方式:编程式事务管理 和 声明式事务管理

声明式事务管理底层使用AOP原理,有两种实现:

(1)基于注解方式(使用)

(2)基于 xml 配置文件方式

1 声明式事务管理的注解实现

1、在 Spring 配置文件配置事务管理器

<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>

2、在 Spring 配置文件,开启事务注解

(1)在 spring 配置文件引入名称空间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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
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">

(2)开启事务注解

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

3、 service 类上面(或者 service 类里面方法上面)添加事务注解

(1)@Transactional,这个注解添加到类上面,也可以添加方法上面;

(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务;

(3)如果把这个注解添加方法上面,为这个方法添加事务。

2 Transactional事务的参数配置

有如下参数:

2.1 propagation:事务传播行为

该参数用于配置当多事务方法直接进行调用时,这个过程中事务是如何进行管理的。

事务方法:对数据库表数据进行变化的操作(不包括查询)。

事务的传播行为有7种:

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择(默认值)。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务;如果当前存在事务,把当前事务挂起,使用新的事务。(无论当前是否有事务,都会创建新的事务)

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

代码示例:

@Transactional(propagation = Propagation.REQUIRED)

2.2 ioslation:事务隔离级别

三个读问题:脏读、不可重复读、幻(虚)读。

脏读是一个问题,在实际情况下不能出现;但是后两种是一种现象,在某些情况下出现也没有什么问题。

(1)脏读

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

具体描述:事务A修改了表中的一行数据,但没有提交,这时候事务B读取了被事务A修改后的数据,之后事务A因为某种原因回滚,那么事务B读取的数据就是脏的。

(2)不可重复度

不可重复读:一个未提交的事务读取到另一个已提交事务数据(修改)。

具体描述:事务A和事务B都读取了表中的一行数据(假设为x),这时事务A修改该数据,将x修改成y,并且提交事务,之后事务B再次读取该行数据发现数据变成了y,即事务B两次读取到的数据不一致。

(3)幻读

幻读:一个未提交事务读取到另一个已提交事务数据(添加)。

通过设置事务的隔离性来解决上述问题(或现象),通过ioslation参数可以设置隔离级别。

  1. 读未提交,最差的级别,三个问题都不能解决
  2. 读已提交,解决脏读问题
  3. 可重复读,解决不可重读问题(MySQL默认的隔离级别)
  4. 串行化,解决幻读问题

代码示例:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)

2.3 timeout:超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚。

(2)默认值是 -1 ,设置时间以秒单位进行计算。

2.4 readOnly:是否只读

(1)读:查询操作;写:添加修改删除操作。

(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作。

(3)设置 readOnly 值是 true,设置成 true 之后,只能查询。

2.5 rollbackFor:回滚

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

2.6 noRollbackFor:不回滚

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

3 声明式事务管理的XML实现

在 spring 的xml配置文件中进行配置:

(1)第一步 配置事务管理器

(2)第二步 配置通知

(3)第三步 配置切入点和切面

<!--1 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据源--><property name="dataSource" ref="dataSource"></property>
</bean><!--2 配置通知-->
<tx:advice id="txadvice"><!--配置事务参数--><tx:attributes><!--指定哪种规则的方法上面添加事务--><tx:method name="accountMoney" propagation="REQUIRED"/><!--<tx:method name="account*"/>--></tx:attributes>
</tx:advice><!--3 配置切入点和切面-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/><!--配置切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

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

创建配置类,使用配置类替代 xml 配置文件

@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///user_db");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}//创建 JdbcTemplate 对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {//到 ioc 容器中根据类型找到 dataSourceJdbcTemplate jdbcTemplate = new JdbcTemplate();//注入 dataSourcejdbcTemplate.setDataSource(dataSource); return jdbcTemplate;
}//创建事务管理器
@Bean
public DataSourceTransactionManager
getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager transactionManager = newDataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;
}
}

参考链接:https://www.bilibili.com/video/BV1Vf4y127N5?p=40

彻底学会Spring事务——概念+具体实现相关推荐

  1. Spring事务专题(三)事务的基本概念,Mysql事务处理原理

    我重新整理了大纲,思考了很久,决定单独将MySQL的事务实现原理跟Spring中的事务示例分为两篇文章,因为二者毕竟没有什么实际关系,实际上如果你对MySQL的事务原理不感兴趣也可以直接跳过本文,等待 ...

  2. spring事务管理-概念部分

    这个Spring中的事务呢,是提供了一套可以管理项目中管理事务的机制,使用Spring事务的好处,就是我们的项目里面,不需要手动来管理事务了,那这样的话咱们先复习一下,先复习一下事务,事务复习好像刚有 ...

  3. Spring 事务原理篇:@EnableTransactionManagement注解底层原理分析技巧,就算你看不懂源码,也要学会这个技巧!

    前言 学习了关于Spring AOP原理以及事务的基础知识后,今天咱们来聊聊Spring在底层是如何操作事务的.如果阅读到此文章,并且对Spring AOP原理不太了解的话,建议先阅读下本人的这篇文章 ...

  4. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非 ...

  5. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  6. springboot 事务手动回滚_来,讲讲Spring事务有哪些坑?

    来自公众号:孤独烟 引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较 ...

  7. Spring事务管理 与 SpringAOP

    1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略.  ...

  8. 面试官: 讲讲 Spring 事务有哪些坑?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 引言 今天,我们来讲 Spring 中和事务有关的考题. ...

  9. 宝贝,来,讲讲spring事务有哪些坑?

    引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较多,没有好好总结过这 ...

最新文章

  1. ftp连接报错:Windows无法访问此文件夹
  2. Web前端必备-Nginx知识汇总
  3. 一霎清明雨,实现考勤管理。
  4. 剑指offer 二维有序数组查找
  5. PHP Smarty变量调节器
  6. python打开浏览器-python调用浏览器,打开一个网址
  7. 前端学习(1269):axios的拦截器
  8. NodeJS学习笔记之express
  9. 团队管理心得--建团队,管事理人
  10. Express框架学习笔记-基础
  11. IT培训行业揭秘(一)
  12. Bigemap APP(Android)手机离线地图使用说明
  13. List接口(ArrayList集合和LinkedList集合)
  14. MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...
  15. 一亩三分地-每日答题
  16. 树莓派+有源低电平触发蜂鸣器+人体红外感应器HC-SR501实现感应报警
  17. 10岁男孩玩游戏花掉1万2,和妈妈打欠条通过家务和学习成绩“还债”
  18. MODIS BRDF数据介绍笔记
  19. 【Hbuilder】Hbuilder 原生App-云打包,报错需要打包校验
  20. OCR读取身份证地址字符串切割成省、市、区

热门文章

  1. 配置python程序debug/run,避免每次运行都会重复加载数据集或模型,节约大量等待时间
  2. python保存任意object的数据到本地(python的序列化与反序列化)
  3. matplotlib 设置水平线、垂直线
  4. java ipmitool_ipmitool使用手册
  5. 华为p20支持手机云闪付吗_余承东:明年华为智能手机全面支持鸿蒙系统
  6. 怎么将ip地址改成域名访问_什么是域名解析?怎么把域名解析成IP地址?
  7. jquery 父元素相邻元素_Jquery中几种查找节点的方法
  8. 公司java框架让程序员变笨_框架会使程序员变笨吗?
  9. java项目命令编译,打包,运行
  10. MANIFEST.MF的用途(转载)