Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring中的事务

Spring中的事务

作者头像
Swingz
发布于 2020-12-18 03:18:59
发布于 2020-12-18 03:18:59
45300
代码可运行
举报
文章被收录于专栏:SwingzSwingz
运行总次数:0
代码可运行

Spring中的事务

配置事务

spring中的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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: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/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">
    
    
        <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>


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

注解开启事务

@Transactional

Spring中事务的传播特性(propagation 属性)

  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional( rollbackFor = Exception.class,propagation = Propagation.NESTED)

事务的隔离级别

SQL 标准定义的四个隔离级别为: Read Uncommitted ( 未提交读 ) 、 Read Committed (提交读)、 Repeatable Read (可重复读)、 Serializable (可串行化) ,下面分别介绍。

1、未提交读

就是一个事务可以读取另一个未提交事务的数据。 (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值: (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account: (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据。 (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏读数据

2、读提交

就是一个事务要等另一个事务提交后才能读取数据。 (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录; (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account; (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题; (4)客户端B的事务提交; (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题

3、重复读

就是在开始读取数据(事务开启)时,不再允许修改操作。 (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录 (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交 (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题。 (4)重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作 (5)重新打开客户端B,插入一条新数据后提交; (6)在客户端A查询表account的所有记录,没有 查出 新增数据,所以没有出现幻读

4、Serializable 序列化(串行化)

序列化是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

1、事务隔离级别为读提交时,写数据只会锁住相应的行;

2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读;

3、事务隔离级别为串行化时,读写数据都会锁住整张表;

4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring事务传播属性和隔离级别
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。
猫头虎
2024/04/07
2320
Spring事务传播属性和隔离级别
Spring声名式事务控制学习笔记
1、事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做。 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
咕咕星
2020/12/23
3430
[ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)
一、Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" encoding="U
Kevin_Zhang
2018/07/09
5750
Spring--事务管理
事务简单来说,就是将多个操作成为一个工作单元,其中任何一个操作执行失败,都会回到工作单元之前的状态
aruba
2022/05/20
2940
Spring--事务管理
Spring源码剖析8:Spring事务概述
事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。
Java技术江湖
2019/11/26
5940
Spring5–06—事务操作:(Spring事务管理介绍)
(1)@Transactional,这个注解添加到类上面,也可以添加方法上面 (2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务 (3)如果把这个注解添加方法上面,为这个方法添加事务
Java架构师必看
2021/05/14
5460
Spring5–06—事务操作:(Spring事务管理介绍)
Spring连接池与事务管理 | Spring学习笔记
第一步:导入 jar 包:c3p0-version*.jar 和 mchange-commons-java-version*.jar
做棵大树
2022/09/27
4210
Spring5 事务
service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSource
用户9615083
2022/12/25
3390
Spring5 事务
Spring5.0源码学习系列之事务管理概述
Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述
烂猪皮
2021/07/16
3250
Spring5.0源码学习系列之事务管理概述
MySQL系列-高级-深入理解Mysql事务隔离级别与锁机制02
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
用户2225445
2022/11/12
4270
MySQL系列-高级-深入理解Mysql事务隔离级别与锁机制02
spring 事务管理方式及配置
  前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
WindWant
2020/09/11
4650
spring 事务管理方式及配置
【二十四】springboot整合spring事务详解以及实战
一直对spring事务这一块内容处于极度浅显的面试理论阶段,实际上并没有仔细学习总结过,这次花了点时间对spring事务进行了一些学习并将自己的学习笔记总结在此处,下面开整。首先从spring事务的概念到代码使用上进行我自己的一番理解解读。 将从下面几点开始一步一步开始学习: 1、什么是spring事务。 2、为什么新建的springboot项目有时候自带事务处理,有时候不带事务处理。 3、spring事务到底如何使用以及使用方式有几种。 4、spring事务的多个属性的操作演练。 本章demo使用前面springboot整合swagger篇的demo进行改造的,代码会上传git。
小z666
2024/06/21
1.1K0
【二十四】springboot整合spring事务详解以及实战
MySQL锁与事务隔离级别
在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
星哥玩云
2022/08/18
6540
MySQL锁与事务隔离级别
Spring-事务
今天开始学习我自己总结的 Java-学习路线 中的《Spring-事务》,小简从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!
小简
2023/01/04
3600
Spring-事务
MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB
Lansonli
2021/10/09
5280
MySQL的四种事务隔离级别
MySQL 事务和 MVCC 机制
了解事务之前,先来看看数据库为什么需要有事务,假设没有事务会有什么影响?假设我们有一个银行账户系统,表结构如下:
Se7en258
2021/07/01
5120
Spring的事务管理
Spring有一个基于AOP之上的事务管理模块,这个模块能够帮助我们在逻辑层中很方便的控制数据库的事务。在此之前我们介绍了Spring对JDBC的模板支持 以及 面向切面的Spring,而且也用Spring的AOP编写了一个简单的切面类用于控制事务,在此对其中一些相同的东西就不再赘述了。所以本文是硬文,就让我们单刀直入地学习如何使用Spring的事务管理模块为我们管理事务吧。
端碗吹水
2020/09/23
7050
Spring 全家桶之 Spring Framework 5.3(七)- 声明式事务
创建一个Maven项目spring-declaration-transaction,增加maven依赖
RiemannHypothesis
2022/08/19
5060
Spring 全家桶之 Spring Framework 5.3(七)- 声明式事务
Spring框架 Spring事务
1 、什么事务 ( 1 )事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败 ( 2 )典型场景:银行转账
郭顺发
2023/07/07
2330
Spring5之事务
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败
yuanshuai
2022/08/22
2220
相关推荐
Spring事务传播属性和隔离级别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验