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

带大家深入了解Spring事务

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

带大家深入了解Spring事务

一、数据库事务简介

构成单一逻辑工作单元的操作集合称作事务(transaction)。即使有故障,数据库系统也必须保证事务的正确执行——要么执行整个事务,要么属于该事务的操作一个也不执行。以资金转账为例,应该保证支票账户支出金额的操作和储蓄账户的存入金额的操作在同一个逻辑工作单元内完成。简言之,事务是访问并可能更新各种数据项的一个程序执行单元(unit)

二、事务的特性

数据库需要维护事务的以下四个性质:

1.原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保这一系列动作要么全部完成,要么完全不起作用。

2.一致性(Consistency)隔离执行事务时(在没有其他事务并发的情况下),保持数据库的一致的数据库状态。

3.隔离性(Isolation)并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。每个事务都感觉不 到系统中其他事务在并发地执行。

4.持久性(Durability)一旦事务完成,数据库的改变必须是永久的,即使出现系统故障。

三、事务的隔离级别

在实际应用中,数据库中的数据是要被多个用户共同访问的,在多个用户同时操作相同的数据时,可能就会出现一些事务并发的问题:

1.脏读(Dirty Read)。一个事务读取到另一个事务未提交的数据。

2.不可重复读(Non-repeatable Read)。一个事务对同一行数据重复读取两次,但得到的结果不同。

3.虚读/幻读(Phantom Read)。一个事务执行两次查询,但第二次查询的结果包含了第一次查询中未出现的数据。

4.丢失更新(Lost Update)。丢失更新可分为两类,分别是第一类丢失更新和第二类丢失更新。第一类丢失更新是指两个事务同时操作同一个数据时,当第一个事务撤销时,把已经提交的第二个事务的更新数据覆盖了,第二个事务就造成了数据丢失。第二类丢失更新是指当两个事务同时操作同一个数据时,第一个事务将修改结果成功提交后,对第二个事务已经提交的修改结果进行了覆盖,对第二个事务造成了数据丢失。

为了避免上述事务并发问题的出现,在标准的 SQL 规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同:

1.Serializable(可串行化)
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读、幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。

2.Repeatable Read(可重复读)
一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。

3.Committed Read(已提交读)
一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。

4.Uncommitted Read(未提交读)
一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。
以上所有隔离性级别都不允许脏写(Dirty Write)。

一般来说,事务的隔离级别越高,越能保证数据库的完整性一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,通常将数据库的默认隔离级别设置为已提交读 (Committed Read),它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁或乐观锁加以控制。

四、Spring事务

Spring事务的本质就是数据库对事务的支持,使用JDBC的事务管理机制,利用java.sql.Connection对象完成对事务的提交,未使用Spring框架前,Java中事务实现示例代码如下:


package com.example.demo;

import java.sql.Connection;
import java.sql.DriverManager;

public class DemoApplication {

    public static void main(String[] args) {
        // 1.获取连接
        Connection conn = DriverManager.getConnection();
        try {
            // 2.将自动提交设置为false
            conn.setAutoCommit(false);  
            
            // 3.执行一到多个CRUD操作
            
            // 4.1手动提交
            conn.commit();
        } catch (Exception e) {
            // 4.2一旦其中一个操作出错都将回滚,所有操作都不成功
            conn.rollback();
        } finally {
            // 5.关闭连接
            conn.colse();
        }
    }
}

Spring框架则提供统一的事务抽象,无论是JTA、JDBC、Hibernate/JPA、Mybatis/Mybatis-Plus,Spring都使用统一的编程模型,使得应用程序可以很容易地在不同的事务框架之间进行切换。这也符合面向接口编程思想。Spring事务框架的代码在org.springframework:spring-tx中。Spring事务抽象的核心类图如下:

在这里插入图片描述

Spring事务管理的核心接口是PlatformTransactionManager。接口PlatformTransactionManager定义事务操作的行为,PlatformTransactionManager依赖TransactionDefinition和TransactionStatus接口。TransactionDefinition接口定义与Spring兼容的事务属性(如隔离级别、事务传播行为等)。TransactionStatus接口则定义事务的状态(如是否回滚、是否完成、是否包含安全点(Save Point)、将基础会话刷新到数据存储区(如果适用)等)。

五、PlatformTransactionManager简介

PlatformTransactionManager是Spring事务框架的核心接口。应用程序可以直接使用PlatformTransactionManager,但它并不是主要用于API:应用程序将借助事务模板(TransactionTemplate)或声明式事务(Declarative Transaction)。
对于需要实现PlatformTransactionManager接口的应用程序,可通过继承AbstractPlatformTransactionManager抽象类的方式实现。AbstractPlatformTransactionManager类已实现事务传播行为和事务同步处理。子类需要实现针对事务特定状态(如:begin,suspend,resume,commit)的模板方法。Spring事务框架已经实现了JtaTransactionManager(JPA)和DataSourceTransactionManager(JDBC)。应用程序可以参考以上方法实现事务管理器。PlatformTransactionManager事务继承示例如下:

在这里插入图片描述

六、Spring事务隔离级别和传播级别

TransactionDefinition接口中定义了Spring事务隔离级别和Spring事务传播级别。隔离级别主要控制事务并发访问时隔离程度。Spring支持的隔离级别如下:

在这里插入图片描述

除了使用ISOLATION_DEFAULT表示使用数据库默认的隔离级别外,其余四个隔离级别与数据库规范的隔离级别一致。
需要注意的是,隔离级别越高,意味着数据库事务并发执行性能越差。JDBC规范虽然定义了事务支持的以上行为,但是各个JDBC驱动、数据库厂商对事务的支持程度可能各不相同。出于性能的考虑我们一般设置READ_COMMITTED级别。针对READ_COMMITTED隔离级别无法避免的脏读,通常使用数据库的锁来处理。
传播级别主要控制含事务方法的调用(如一个事务方法调用另一个事务方法)时,Spring对事务的处理方式。Spring事务传播级别共七类。它们是:

(1)PROPAGATION_REQUIRED:支持当前事务,如果当前有事务则加入,如果当前没有事务则新建一个。这种方式是默认的事务传播方式

(2)PROPAGATION_SUPPORTS:支持当前事务,如果当前有事务则加入,如果当前没有事务则以非事务方式执行。

(3)PROPAGATION_MANDATORY:支持当前事务,如果当前有事务则加入,如果当前没有事务则抛出异常。(当前必须有事务)

(4)PROPAGATION_REQUIRES_NEW:支持当前事务,如果当前有事务则挂起当前事务,然后新创建一个事务,如果当前没有事务则自己创建一个事务。

(5)Propagation_NOT_SUPPORTED:不支持当前事务,如果当前有事务则把当前事务挂起,执行完后恢复事务(忽略当前事务)。

(6)PROPAGATION_NEVER:不支持当前事务,如果当前存在事务,则抛出异常。(当前必须不能有事务)

(7)PROPAGATION_NESTED:如果当前存在事务,则嵌套在当前事务中。如果当前没有事务,则新建一个事务自己执行。对嵌套事务来说,内部事务回滚时不会影响外部事务的提交;但是外部事务回滚会把内部事务一起回滚回去。(这个和新建一个事务的区别)

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

免责声明:

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

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

带大家深入了解Spring事务

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

下载Word文档

猜你喜欢

深入了解mysql长事务

前言: 本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章将给你答案。注意:本篇文章并不聚焦于谈论事务隔离级别以及相关特性。而是介绍长事务相关危害以及监控处
2022-05-20

一文带你深入了解Go语言中的事务

事务中止时,你结束事务了吗?在开发时有可能就会犯这样的错误,其问题就是你在提交事务时,如果中间有其他业务就取消操作,那么事务也关闭了吗?本文就来详细讲讲
2023-05-16

带你深入了解Android的事件分发机制

Android的事件分发机制是指在Android系统中,如何将用户的触摸事件、按键事件等传递给正确的View进行处理的一套机制。它是Android应用程序中实现交互的重要部分,确保用户的操作能够被正确地捕获和处理。 Android的事件分发
2023-08-18

Redis深入了解内存淘汰与事务操作

目录Redis内存淘汰策略六种淘汰策略Redis中的自动过期机制Redis中的事务操作watch和Multi的区别Redis内存淘汰策略为什么要有淘汰策略?答:将Redis用作缓存时,Redis数据存在内存中,如果内存空间用满,就会自动
2022-07-28

深入剖析数据库事务:了解其特性和注意事项

事务是数据库管理系统中确保数据完整性和一致性的一项重要机制。本文将探讨事务的特性、类型、隔离级别以及在使用事务时需要注意的事项,以帮助读者深入理解事务在数据库中的作用和使用方式。
深入剖析数据库事务:了解其特性和注意事项
2024-02-25

深入理解Spring事务及传播机制之原理解析与实际应用

Spring事务管理机制提供了多种传播行为,可以控制事务的范围和隔离级别,保证数据一致性和完整性。在实际应用中,需要根据具体业务场景选择合适的传播行为实现事务控制
2023-05-16

数据库事务的实现方式:深入了解其底层机制

:数据库事务是一种确保数据库操作原子性和一致性的机制,它允许用户将多个相关操作作为一个整体来执行,并且要么所有操作都成功,要么所有操作都失败。
数据库事务的实现方式:深入了解其底层机制
2024-02-25

阿里云服务器销售合作协议是什么?带你深入了解

本文将详细解读阿里云服务器销售合作协议,帮助您了解如何在阿里云上销售服务器,并获得相应的收益。阿里云服务器销售合作协议是什么?它是指阿里云与合作伙伴签署的协议,明确双方在销售服务器方面的权利和义务。根据协议,合作伙伴可以获得阿里云的服务器资源,并通过自身的销售和营销能力,将这些服务器销售给最终用户。协议主要内容包
阿里云服务器销售合作协议是什么?带你深入了解
2023-11-08

阿里云服务器ECS能干嘛?带你深入了解其功能和用途

阿里云服务器ECS是阿里云推出的一种高性能、可扩展的云服务器,它能够满足各种不同场景的需求,如web应用、数据库服务器、科学计算等。本文将详细介绍阿里云服务器ECS的功能和用途。阿里云服务器ECS的功能:高性能:阿里云服务器ECS使用了最新的处理器和高速存储技术,能够提供稳定高效的运行性能。可扩展性:阿里云服务器
阿里云服务器ECS能干嘛?带你深入了解其功能和用途
2023-11-14

阿里云服务器能恢复快照吗?带你深入了解快照恢复功能

阿里云服务器作为云计算的重要组成部分,其稳定性和安全性一直备受关注。本文将深入介绍阿里云服务器的快照恢复功能,让用户更好地了解和利用这一功能。正文:阿里云服务器作为云计算的重要组成部分,其强大的计算能力和稳定性备受用户好评。同时,阿里云服务器的快照恢复功能,也为用户提供了数据备份和恢复的解决方案。那么,阿里云服务
阿里云服务器能恢复快照吗?带你深入了解快照恢复功能
2023-11-16

编程热搜

  • 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动态编译

目录