MySQL 篇-深入了解事务四大特性及原理

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
   

文章目录

        1.0 事务的概述

        2.0 事务的特性

        2.1 原子性

        2.2 一致性

        2.3 持久性

        2.4 隔离性

        2.4.1 脏读问题

        2.4.2 不可重复读问题

        2.4.3 幻读问题

        3.0 事务的四个隔离级别

        3.1 read uncommitted

        3.2 read committed

        3.3 repeatable read

        3.4 串行化


        1.0 事务的概述

        在数据库管理系统中,事务是确保数据完整性和一致性的重要机制,通过事务的管理可以有效地处理并发操作、故障恢复等问题。

        用简单通俗的话来说,将多条 SQL 语句打包在一起并作为一个逻辑单元执行,可以构成一个事务,如果某一条语句出现错误,则进行回滚操作,最终可以使得数据回复到原来的样子;如果 “打包” 在一起的语句都没有出现错误,则进行提交操作,数据就会进行相应的变化并保持持久性。

语法结构:

-- 开始事务
start transaction;-- 事务回滚
rollback;-- 事务提交
commit;

举个例子:

START TRANSACTION;UPDATE table1 SET column1 = value1 WHERE condition1;
INSERT INTO table2 (column1, column2) VALUES (value1, value2);COMMIT;

        在以上例子中,UPDATE 和 INSERT INTO 语句被包含在同一个事务中。如果这些 SQL 都可以执行成功,事务被提交;如果其中的某一条失败,整个事务将被回滚。

        2.0 事务的特性

        事务具有四个特性,通常被称为 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

        是数据库管理系统中保证数据操作正确性和可靠性的基础。通过事务的管理,可以避免数据丢失、数据不一致等问题,保证数据库操作的安全性和可靠性。

        2.1 原子性

        事务是一个不可分割的工作单位,将多条 SQL 语句打包在一起形成一个事务,要么一起执行成功,要么一条都不执行。如果全部语句执行成功,通过 commit 提交;如果事务中某一条语句执行失败,通过 rollback 回滚,整个事务将被回滚到初始状态。

        2.2 一致性

        执行事务前和执行事务完毕后,数据是一致性的,不会出现 “对不上” 的情况。如果事务发生回滚,执行事务前后的数据是一致的;如果事务顺利执行,执行事务前与执行事务后的数据一定能对的上。

        2.3 持久性

        一旦事务提交成功,其所做的操作将永久保存在数据库中(磁盘)。即使系统发生故障或重启,数据也不会丢失。数据一定存储在硬盘中。

        2.4 隔离性

        多个事务同时执行时,每个事务的操作与其他事务相互隔离,互不打扰。

        数据库中并发执行事务时,产生的一些情况:脏读问题、不可重复读问题、幻读问题。

        2.4.1 脏读问题

         脏读指一个事务读取了另一个事务未提交的数据,即读取到了未提交的数据,如果另一个事务回滚,读取的数据就是无效的。

脏读的具体情况:

        在并发执行事务中,假设事务 A 与事务 B 对同一份数据进行操作时,事务 A ,事务 B 同时进行对数据的操作,很有可能会遇到这样的问题:当事务 B 读到 data 数据之后,凑巧事务 A 在事务 B 读完该数据 data 后,将 data 改为 datas 。这种情况就是事务 B 读到了脏数据。 需要重点注意的是:事务 B 读取的是事务 A 未提交的数据。  

举个例子:​

​​​​​​

解决办法:

        在事务  A 进行写操作的时候,事务 B 不应该再去读取事务 A 正在操作的数据。因此,引入上锁之后,执行 A 的过程中,B 就不能执行了,要等待。简单来说:加上写锁后,在写操作过程中,是不允许其他事务来读取正在操作的数据。

        这就相当于降低了 '并发能力',也就降低数据库服务器的处理效率,提高了 '隔离性' ,也提高了数据的准确性。并发执行事务过程中,相互之间是如何影响的,彼此的影响越小,隔离性越高;反之影响越大,隔离性越低。

        2.4.2 不可重复读问题

        一个事务先后读取同一个数据 ,但两次读取的数据不同,称之为不可重复读。

        在执行并发事务时,假设事务 A 在第一次读取的数据 data ,凑巧事务 B 将 data 改为 data2 并且成功提交了。当事务 A 第二次读取的数据 data2 时,发现与之前的 data 不是同一个数据。需要注意的是:第二次读取的是事务 B 已经提交的数据。这就是不可重复读。

举个例子:

解决方法:

        在事务 A 进行读取操作的时候,不能让事务 B 进行写操作。加上读锁后,读数据的时候,不能修改数据。这就可以保证事务 A 前后两次读取的数据都是一致的。

        加上读锁后,也会降低数据库服务器的并发能力,提高了隔离性,让数据的准确性大大提升。

读藏与不可重读的区别:

        1)主要区别在于脏读是读取了未提交的数据,而不可重复读是读取了已提交的数据,但在读取过程中数据被其他事务修改了。

        2)脏读可能会导致读取到无效数据,而不可重复读可能会导致读取到不一致的数据。

        2.4.3 幻读问题

        也是数据库事务并发控制中的一个问题,指在一个事务内多次查询同一个范围的数据,但在查询过程中,其他事务插入了新的数据,导致多次查询结果不一致的情况。

        在执行并发操作时,事务 A ​在某个范围内执行查询操作,获取了一些数据行。在事务 A 执行期间,事务 B ​在同样的范围内插入了新的数据行。事务 A 再次执行相同的查询操作,发现范围内出现了新的数据行,导致查询结果不一致。

        事务 A 先后两次得到的结果集不同。

举个例子:

解决办法:

        “串行化”使所有的事务都严格的按照“一个接一个”的方式执行,完全没有并发了,此时执行效率是最低的,隔离性也是最高的,数据也是最准确的。

幻读与不可重复读的区别:

        1)不可重复读是指在事务中多次读取同一行数据时,其他事务修改了该行数据,导致读取结果不一致。

        2)幻读是指在事务中多次查询同一范围的数据时,其他事务插入了新的数据,导致查询结果不一致。

        3.0 事务的四个隔离级别

        MySQL 给程序员提供了四个隔离级别,可以在 MySQL 配置文件中进行设置:

        3.1 read uncommitted

                允许读取其他事务未提交的数据。

                存在脏读、不可重复读、幻读情况,此时的并发效率是最高的,隔离性最低。

        3.2 read committed

                只能允许读取其他事务提交后的数据。

                存在不可重复读、幻读情况,并发效率降低,隔离性提高。

        3.3 repeatable read

                针对读操作与写操作都加锁了。

                存在幻读情况,并发效率继续降低,隔离性提高。

        3.4 串行化

                所有事务都是串行执行的。

                此时不存在以上三种情况了,完全解决。但是并发基本没有了,隔离性最高。

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

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

相关文章

【LeetCode】升级打怪之路 Day 17:二叉树题型 —— 二叉树的序列化与反序列化

今日题目: 297. 二叉树的序列化与反序列化652. 寻找重复的子树 目录 LC 297. 二叉树的序列化与反序列化 【classic】 ⭐⭐⭐⭐⭐1)序列化逻辑2)反序列化逻辑 LC 652. 寻找重复的子树 【稍有难度】 今天主要学习了二叉树的序列化和反序列化相关…

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

Redis及其数据类型和常用命令(一)

Redis 非关系型数据库,不需要使用sql语句对数据库进行操作,而是使用命令进行操作,在数据库存储时使用键值对进行存储,应用场景广泛,一般存储访问频率较高的数据。 一般关系型数据库(使用sql语句进行操作的…

伪分布HBase的安装与部署

1.实训目标 (1)熟悉掌握使用在Linux下安装伪分布式HBase。 (2)熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …

TimescaleDB 安装部署

文章目录 1.Yum安装TimescaleDB1.1.安装PostgreSQL1.2.安装Timescaledb插件1.3.创建Timescaledb扩展 2.Docker安装Timescaledb 开源中间件 # TimescaleDBhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/timescale/timescale-deploy/1.Yum安装…

【Java 多线程】synchronized优化的过程

synchronized 原理 基本特定 开始时是一个乐观锁,如果锁冲突频繁,就变成悲观锁开始是轻量级锁,如果锁被持有的时间比较长,就变成重量级锁实现轻量级锁的时候大概率用到自旋锁的策略是一种不公平锁是一种可重入锁不是读写锁 加锁…

信捷PLC XD3/XD5系列通过网口或串口如何实现远程上下载程序?

信捷PLC是一种可编程逻辑控制器,广泛应用于工业自动化领域。它具有高可靠性、灵活性和可编程性的特点,可以用于监控和控制各种生产设备。信捷PLC的远程控制和程序上下载可以通过网关实现。 而PLC远程透传网关是博达智联针对目前自动化行业内客户需求多变…

Tomacat下载并且手动自动部署Web项目

Tomacat下载并且手动自动部署Web项目 Tomcat的简介Tomcat的作用Tomcat的下载Tomcat 部署1、环境准备2、手动部署项目3、自动部署项目(IDEA) ⭐ 前言 ⭐ 本篇文章主要介绍 Tomacat下载部署Web项目的详细使用以及部分理论知识 Tomcat的简介 Tomcat 服务…

logistic回归分析

结局变量:二分类(常见)或多分类变量研究一个或多个原因变量和结果变量的因果关系 eg:Y必须是分类变量

html--钢琴

代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>html钢琴</title> <script src"js/js.js"></script> <link href"…

寄存器(内存访问)

文章目录 寄存器&#xff08;内存访问&#xff09;1 内存中字的存储2 DS和[address]3 字的传送4 mov、add、sub指令5 数据段6 栈7 CPU提供的栈机制8 栈顶超界的问题9 push、pop指令10 栈段 寄存器&#xff08;内存访问&#xff09; 1 内存中字的存储 CPU中&#xff0c;用16位寄…

Nginx的日志怎么看,在哪看,access.log日志内容详解

Nginx 的日志文件通常位于服务器的文件系统中&#xff0c;具体位置可能因配置而异。以下是查看 Nginx 日志的几种方法&#xff1a; 1、查看访问日志&#xff1a;在默认配置下&#xff0c;Nginx 的访问日志文件路径为 /var/log/nginx/access.log。您可以通过命令 sudo cat /var…