Seata 2.x 系列【2】数据库事务

有道无术,术尚可求,有术无道,止于术。

本系列Spring Boot 版本 3.1.0

本系列Seata 版本 2.0.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • 1. 概述
    • 2. ACID 模型
      • 2.1 原子性
      • 2.2 一致性
      • 2.3 隔离性
        • 2.3.1 事务并发异常
          • 2.3.1.1 第一类更新丢失(回滚丢失)
          • 2.3.1.2 第二类更新丢失(覆盖丢失)
          • 2.3.1.3 脏读
          • 2.3.1.4 不可重复读
          • 2.3.1.5 幻读
        • 2.3.2 隔离级别
          • 2.3.2.1 读未提交 Read uncommitted
          • 2.3.2.2 读已提交 Read committed
          • 2.3.2.3 可重复度 Repeatable read
          • 2.3.2.4 序列化 Serializable
      • 2.4 持久性

1. 概述

在计算机术语中,事务Transaction)是指多个数据库操作组成一个不可分割的执行单元,这些操作要么全部成功,要么全部失败,不会结束在中间的某个环节,同时在这些操作执行后,需要保证数据可靠一致

例如在MySql中使用事务:

-- 开启事务
START TRANSACTION; 
-- 一些列操作
INSERT INTO user(username,password) VALUES ('root','123456'); -- 插入  
UPDATE t_user SET username=’cangJJ’ WHERE id=1; -- 更新-- 提交事务
COMMIT;

2. ACID 模型

ACID模型是指数据库中的事务必须满足原子性Atomicity)、一致性Consistency)、隔离性Isolation)、持久性Durability)四大特性,是数据库设计的基本原则,以保证数据的可靠一致,即便在软件崩溃、硬件故障的情况下,数据也不会被破坏。

其中原子性隔离性持久性是为一致性服务的,即AID是手段,C是最终实现的目标。

2.1 原子性

原子性也可称为不可分割性,是说事务操作必须是原子工作单元,一个事务中的操作要么全部都执行成功,要么全部都回滚撤销执行,不会存在部分成功或失败的情况。

例如经典的银行转账场景中,转账操作可以分为以下两步:

  • A账户中扣除金额
  • 将扣除金额存入到B账户
    在这里插入图片描述
    整个转账操作过程可以看作是一个事务,原子性要求成功则全部成功,失败则需要全部撤消。如果第一步成功,第二步失败,整个操作应该取消,若不取消第一步的操作,则会发生丢失款项的问题。

2.2 一致性

一致性是指一个事务执行之前和执行之后都必须处于一致性状态。

2.3 隔离性

隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

2.3.1 事务并发异常

数据库是要被共享访问的,那么在并发操作数据库过程中很可能出现以下很多异常情况。

2.3.1.1 第一类更新丢失(回滚丢失)

比如下图中,T1T2同时执行,由于没有事务隔离,虽然T1更新成功,但是T2进行了回滚,余额却没有变化,这种因为回滚导致另外一个事务操作丢失的情况叫做回滚丢失。
在这里插入图片描述

2.3.1.2 第二类更新丢失(覆盖丢失)

比如下图中,T1T2同时执行,由于没有事务隔离,T1T2都提交了事务,但是由于T2后执行,将T1事务的操作覆盖了,导致更新丢失问题。
在这里插入图片描述

2.3.1.3 脏读

脏读是因为一个事务读取了另一个事务修改了但是未提交的数据。

比如下图中,T1修改余额为1100,此时T2开始事务查询到的结果为1100,由于读取到了未提交的事务,当T1回滚时,T2还在脏数据上操作,会导致结果错误。
在这里插入图片描述

2.3.1.4 不可重复读

不可重复读是指一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果。

比如下图中,在T2中,多次查询的不一致,如果这个时候修改,就会造成数据错误。

在这里插入图片描述

2.3.1.5 幻读

幻读和不可重复读有点像,两者都表现为两次读取的结果不一致,只是针对的不是数据的值而是数据的数量。不可重复读重点在于updatedelete,而幻读的重点在于insert

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。
XFfNDM0Mzc4NzQ=,size_20,color_FFFFFF,t_70,g_se,x_16)

2.3.2 隔离级别

数据并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能就是致命的,数据库通常会通过锁机制来解决数据并发访问问题,

直接使用锁是非常麻烦的,为此数据库为用户提供了自动锁机制,只要用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来说都是透明的。ANSI/ISO SQL 92标准定义了4个等级的事务隔离级别,如下表所示:
在这里插入图片描述
事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高并发性就越差。所以要根据具体的应用来确定合适的事务隔离级别,这个地方没有万能的原则。

可以通过以下SQL 查询和修改会话级别:

-- 查询数据库版本
SELECT VERSION();
-- 查询当前会话事务界别
SELECT @@session.tx_isolation;
-- 设置当前会话事务隔离级别,仅仅该窗口会话有效
set session tx_isolation='read-uncommitted';
2.3.2.1 读未提交 Read uncommitted

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据,这个级别,几乎没有任何隔离性,一般不会采用这个隔离级别。

2.3.2.2 读已提交 Read committed

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。另外一个事务不能读取该事务未提交的数据。

在Navicat 中,打开两个会话窗口,修改隔离级别为读已提交:

-- 设置当前会话事务隔离级别,仅仅该窗口会话有效
set session tx_isolation='Read-committed';

开启事务,将当前账户余额扣掉100,不提交事务:

START TRANSACTION;
UPDATE account_tbl 
SET money = money - 100 
WHEREid = "11111111";

在另外一个窗口,查询当余额:

SELECT* 
FROMaccount_tbl 
WHEREid = "11111111";

可以看到读取到的余额仍为1000,说明该隔离级别下,事务读取不到另外一个事务未提交的数据。
在这里插入图片描述

分析:这就是读已提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但是存在不可重复读问题,一旦事务提交后,另外的事务再次查询,查询结果会不一致。

2.3.2.3 可重复度 Repeatable read

可重复读,就是在开始读取数据(事务开启)时,多次读取到的结果是一致的,这是Mysql 默认的事务隔离级别。

比如我们先开启一个事务,读取数据,此时查询结果为1000:
在这里插入图片描述
另外一个事务,修改当前数据,并提交事务:

XplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDM0Mzc4NzQ=,size_19,color_FFFFFF,t_70,g_se,x_16)
查询事务中,再次查询,发现余额没有变,这就是可重复读,Repeatable Read的确可以解决“不可重复读”的问题。

2.3.2.4 序列化 Serializable

Serializable是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。

虽然Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

2.4 持久性

持久性是指事务一旦被提交,对数据库中的数据的改变就是永久性的,不会因为任何情况回到原来的状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman报错提示 Could not get any response怎么解决

在通过postman请求做接口测试的过程中,有时候会遇到一些报错,当遇到这些报错我们不要着急,看着具体哪里报错,然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错,遇到报错的时候我们不要着急&…

这可是全网网工华为认证学习笔记最完整,最详细的版本,没有之一

文章篇幅较长,耐心看完你一定有所收获。 华为认证是什么? 其实就是由华为公司所提出的评价网络工程师专业能力的一个认证,它分为三个级别,分别是这个华为认证的工程师(HCIA),华为认证的高级工程…

CTP-API开发系列之三:柜台系统简介

CTP-API开发系列之三:柜台系统简介 CTP-API开发系列之三:柜台系统简介中国金融市场结构---交易所柜台系统通用柜台系统极速柜台系统主席与次席 CTP柜台系统CTP组件名称对照表CTP柜台系统程序包CTP柜台系统架构图 CTP-API开发系列之三:柜台系统…

重新排序。

问题描述 给定一个数组A和一些查询 L,R求数组中第L至第 R个元素之和。 小蓝觉得这个问题很无聊,于是他想重新排列一下数组使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可 以增加多少? 输入格式 输入第一行包含一个整数n。 第二行包含n个…

钉钉群内自定义机器人发送消息功能实现

文章目录 钉钉群内自定义机器人发送消息功能实现1、设置webhook自定义机器人2、查看官方文档,使用open api3、编写业务代码4、发送成功结果如下 钉钉群内自定义机器人发送消息功能实现 1、设置webhook自定义机器人 设置关键词 添加完成后,获得改机器人的…

直流电磁铁计算公式

直流电磁铁计算公式 1. 磁势2. 磁场强度3. 磁感应强度4. 电磁吸力5. 线圈发热 1. 磁势 产生磁场的磁势计算公式: F N ⋅ I FN \cdot I FN⋅I N:是线圈匝数,I:是线圈中的电流注:线圈过热,可以减小电流&am…

力扣--从前序与中序遍历序列构造二叉树

题目: 思想: 首先先序遍历能确定根节点的值,此时查看该值在中序遍历中的位置(如果索引为i),那么i左侧为左子树,i 右侧为右子树。从中序数组中即可看出左子树结点个数为 i,右子树节点…

浅析扩散模型与图像生成【应用篇】(八)——BBDM

8. BBDM: Image-to-Image Translation with Brownian Bridge Diffusion Models 本文提出一种基于布朗桥(Brownian Bridge)的扩散模型用于图像到图像的转换。图像到图像转换的目标是将源域 A A A中的图像 I A I_A IA​,映射到目标域 B B B中得…

详解事件循环机制

浏览器最主要的进程 : 渲染主线程 如何理解JS的异步 任务没有优先级,但消息队列有优先级 阐述一下JS的事件循环

图书馆管理系统(2)

接下来实现系统的子菜单,在写一个子模块的时候,其他子模块先屏蔽起来,因为没实现,代码运行就通不过 屏蔽起来写上todo,后面(Ctrl键F)搜索,找todo来实现 先来实现图书管理模块 第一步,先要把图…

IDEA 配置文件乱码,项目编码设置

见下图 其中第一二项控制全局以及工程的编码格式,下方的则是 properties 配置文件的格式,统一调整为 UTF-8 后不再乱码

网络原理初识(2)

目录 一、协议分层 1、分层的作用 2、OSI七层模型 3、TCP / IP五层(或四层)模型 4、网络设备所在分层 5、网络分层对应 二、封装和分用 发送过程(封装) 1、应用层(应用程序) QQ 2、输入层 3、网络层 4、数据链路层 5、物理…

ai直播数字人!AI大模型应用开发高级技术

AI直播数字人是一种新兴的技术应用,通过AI大模型的应用开发,实现了数字人的虚拟化呈现。数字人作为一种虚拟人物形象,在直播平台或其他媒介中可以展现出真实人物的表情、动作和声音,并且能够与观众进行实时互动,给人带…

视觉slam十四讲学习笔记(七)视觉里程计 2

介绍直接法的原理,并利用 g2o 实现直接法中的一些核心算法。 前言 1. 理解光流法跟踪特征点的原理。 2. 理解直接法是如何估计相机位姿的。 3. 使用 g2o 进行直接法的计算。 哔哩哔哩课程连接:视觉SLAM十四讲ch7_2_哔哩哔哩_bilibili 一、直接法…

django中URL配置和视图渲染

前提: 使用django-admin startproject XXX创建了一个django项目【项目目录为project】 django-admin startproject project 一:控制器配置 在项目的根目录创建一个Controller目录,后续所有的控制器方法都放在此目录下 这里我们在Control…

20240307-2-前端开发校招面试问题整理HTML

前端开发校招面试问题整理【2】——HTML 1、HTML 元素&#xff08;element&#xff09; Q&#xff1a;简单介绍下常用的 HTML 元素&#xff1f; 块状标签&#xff1a;元素独占一行&#xff0c;可指定宽、高。 常用的块状元素有&#xff1a; <div>、<p>、<h1&…

unity学习(50)——服务器三次注册限制以及数据库化角色信息5--角色信息数据库化收尾

上一节内容结束后确实可以写入文件了&#xff0c;但还有两个问题&#xff1a; 1.一个是players.txt中&#xff0c;每次重启服务器&#xff0c;当注册新账号创建角色时&#xff0c;players.txt之前内容都会清空。 2.players.txt之前已经注册3次的账号&#xff0c;新注册的角色…

首发:鸿蒙面试真题分享【独此一份】

最早在23年华为秋季发布会中&#xff0c;就已经宣布了“纯血鸿蒙”。而目前鸿蒙处于星河版中&#xff0c;加速了各大互联网厂商的合作。目前已经有200参与鸿蒙的原生应用开发当中。对此各大招聘网站上的鸿蒙开发需求&#xff0c;每日都在增长中。 2024大厂面试真题 目前的鸿蒙…

使用Java生成JWT(JSON Web Token)的详细指南

介绍 在现代应用程序中&#xff0c;身份验证和授权是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式用于在各方之间安全地传输信息。在本文中&#xff0c;我们将学习如何使…

驱动调试第013期-G120XA驱动同步电机应用案例

概述 SINAMICS G120XA是西门子SINAMICS系列变频器的新成员&#xff0c; 功率范围覆盖0.75 kW~560 kW&#xff0c;内置风机和水泵行业应用功能&#xff0c;汇集了优异的高性能矢量控制算法&#xff0c;可以轻松的驱动风机、水泵及压缩机等负载。胜任各种应用场合&#xff0c;专…