我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring事务管理零基础入门

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring事务管理零基础入门

一、简介

概念:事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作一起提交,要么都执行,要么都不执行。事务时一组不可分割的操作集合(工作逻辑单元)。

简而言之,就是一系列操作要么都执行成功(事务提交),要么都执行失败(事务回滚)

二、特性(一原持久隔离)

2.1 原子性

事务中所有操作是不可再分割的原子单位。事务中所有操作要么都执行成功,要么都执行失败

2.2 一致性(类似能量守恒)

事务执行后,数据库状态与其他业务规则保持一致,保证数据的一致性

2.3 隔离性

在并发操作中,不同事务之间应该隔离开,使每个并发的事务不会相互干扰

2.4 持久性

一旦事务提交成功,事务中所有的数据操作都必须持久化到数据库中,即使提交事务后,数据库立马崩溃,在数据库重启时,也必须能通过某种机制恢复数据

三、隔离级别

3.1 事务级别(从低到高)

Read uncommitted:

读未提交,一个事务可以读取另一个未提交事务的数据。会产生脏读。

Read committed:

读提交,一个事务要等另一个事务提交后才能读取数据,会产生不可重复读。

Repeatable read:

重复读,开始读取数据(事务开启)时,不再允许修改操作,可能出现幻读。

Seriazable:

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

3.2 常用数据库默认级别:

Sql Server、Oracle 默认事务隔离级别: Read committed

Mysql 默认隔离级别是:Repeatable read

3.3 事务中可能出现的问题:

脏读(读取了未提交的新事物,然后回滚了)

A 事务读取了 B 事务中未提交的数据, 如果事务 B 回滚,则 A 读取使用了错误的数据。

不可重复读(读取了提交的新事物,指更新操作)

在对于数据库中某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改了。

幻读(读取了新提交的事务,指增加删除操作)

在事务 A 多次读取构成中,事务 B 对数据进行了新增/删除操作,导致 事务 A 多次读取的数据不一致。

第一类事务丢失(回滚丢失)

事务 A、B 同时执行一个数据,事务 B 已经提交,事务 A 回滚了,B 的事务操作就因为事务 A 回滚而丢失了

第二类事务丢失(提交覆盖丢失)

事务 A、B 同时执行一个数据,两个同时获取到一个数据,事务 B 先提交, 事务 A 后提交,则事务 A 覆盖了事务 B

四、传播特性

事务的传播性分为以下三类,所有的都是给内部方法配置

4.1 死活都不要事务

Never:外部方法没有事务就非事务执行,有就抛出异常

Not_Supported:外部方法没有事务就非事务执行,有就直接挂起,然后非事务执行

4.2 可有可无的

Supported:外部方法有事务就用,没有就算了

4.3 必须要有事务

Requires_new:不管外部方法有没有事务都新建事务,如果外部有,就将外部事务挂起

Nested:如果外部方法没有事务,就新建一个事务,如果外部有事务,就在外部事务中嵌套事务

Required:如果外部方法没有事务就新建一个事务,如果有,就加入外部方法的事务,这个是最常用的,也是默认的

Mandatory:如果外部方法没有事务就抛出异常,如果有,就使用外部方法的事务

五、应用

5.1 数据表

5.2 实体类

import lombok.Data;
import javax.persistence.*;
@Data
@Entity
public class User {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private double money;
}

5.3 Service

package com.dily.study.work.service;
import com.dily.study.work.entity.User;
import com.dily.study.work.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    @Autowired // 使用jpa
    private UserRepository userRepository;
    
    public void out(String fromName, int money) {
        User user = userRepository.findByName(fromName);
        user.setMoney(user.getMoney() - money);
        userRepository.save(user);
    }
    
    public void in(String toName, int money) {
        User user = userRepository.findByName(toName);
        user.setMoney(user.getMoney() + money);
        userRepository.save(user);
    }
     
    @Transactional
    public void transfer(String fromName, String toName, int money) {
        out(fromName, money);
        if (true) throw new RuntimeException("出错了");
        in(toName, money);
    }
    
    public void transfer(String fromName, String toName, int money) {
        out(fromName, money);
        if (true) throw new RuntimeException("出错了");
        in(toName, money);
    }
}

事务的嵌套

// 在 UserService 中注入自己,因为如果内部调用自己的方法,事务注解不生效。
@Autowired
private UserService userService;

@Transactional
public void laoda(String fromName, String toName, int money) {
    userService.out(fromName, money);
    if (true) throw new RuntimeException("出错了");
    userService.xiaodi(toName,money);
}

@Transactional(propagation = Propagation.MANDATORY)
public void xiaodi(String toName, int money) {
    if (true) throw new RuntimeException("出错了");
    userService.in(toName, money);
}

内外部方法尽量避免操作同一张表,当外部方法事务挂起时,则外部操作的表会被加锁,内部方法事务则无法操作同一张表

到此这篇关于Spring事务管理零基础入门的文章就介绍到这了,更多相关Spring事务管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring事务管理零基础入门

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring零基础入门IOC

IoC就是比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建该类的对象,使用对象调用方法来实现。但对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的
2022-11-13

Spring零基础入门WebFlux响应式编程

Spring提供了两个并行堆栈,一种是基于带有SpringMVC和SpringData结构的ServletAPI,另一个是完全反应式堆栈,它利用了SpringWebFlux和SpringData的反应式存储库,这篇文章主要介绍了Spring-webflux响应式编程,需要的朋友可以参考下
2022-11-13

阿里云服务器教程零基础入门指南

阿里云服务器是阿里巴巴推出的一种云计算产品,为用户提供灵活、高效、安全的云计算服务。本文将为您提供一份零基础入门的阿里云服务器教程,让您轻松上手。正文:一、了解阿里云服务器阿里云服务器是阿里云提供的云计算产品,可以帮助您快速搭建和运行网站、应用程序、数据库等服务。它具有高可用性、高扩展性、高性能和低成本的特点,可
阿里云服务器教程零基础入门指南
2023-11-15

零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门

本文改自非鱼的《【翻译】前端开发人员入门指南,从零开始搭建Node.js, Express, Jade, Mongodb服务器》,之所以把Jade换成Ejs,是因为我觉得ejs更符合WEB编程人员的习惯,更确切说应该是更符合PHP、ASP程
2022-06-04

JMX 入门:探索 Java 监控和管理的基础知识

JMX(Java 监控和管理)是一种标准框架,用于监控和管理 Java 应用程序。本文将深入探讨 JMX 的基础知识,指导您使用示例代码实现监控和管理任务。
JMX 入门:探索 Java 监控和管理的基础知识
2024-02-19

Spring依赖注入与第三方Bean管理基础详解

依赖注入(DependencyInjection)和控制反转(InversionofControl)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例
2022-12-23

深入浅析Java中的Spring事务管理

深入浅析Java中的Spring事务管理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境与版本本文出来之前的一篇文章中的hibernate的相关lib 外Java事务管理之H
2023-05-31

MySQL基础篇(06):事务管理,锁机制案例详解

本文源码:GitHub·点这里 || GitEE·点这里一、锁概念简介1、基础描述锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题。锁机制是一个非常大的模块,贯彻MySQL的几大核心难点模块:索引,锁机制,事务。这里是基于MySQL5
MySQL基础篇(06):事务管理,锁机制案例详解
2018-06-26

Java集合框架宝典:从零基础到精通,掌握数据管理的不二法门

Java集合框架是Java平台提供的用于存储和管理集合类型数据的API,它为开发人员提供了丰富的集合类型和操作方法,极大地简化了数据管理的复杂性。本文将从零基础开始,逐步介绍Java集合框架的组成、体系结构、基本操作方法和具体实现,帮助读者掌握Java集合框架的精髓,成为数据管理的高手。
Java集合框架宝典:从零基础到精通,掌握数据管理的不二法门
2024-02-22

Spring基于Aop实现事务管理流程详细讲解

这篇文章主要介绍了Spring基于Aop实现事务管理流程,事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性,感兴趣想要详细了解可以参考下文
2023-05-20

Spring IoC、面向切面编程、事务管理等Spring基本概念详解

一、Spring IoC1.1 重要概念1)控制反转(Inversion of control)控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式。控制反转IoC(Inversion of Con
2023-06-02

SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

本文源码:GitHub·点这里 || GitEE·点这里一、事务管理简介1、事务基本概念一组业务操作ABCD,要么全部成功,要么全部不成功。2、特性:ACID原子性:整体一致性:完成隔离性:并发持久性:结果3、隔离问题脏读:一个事务读到另
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录