MySQL篇—事务和隔离级别介绍

☘️博主介绍☘️

✨又是一天没白过,我是奈斯,DBA一名✨

✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌️

❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣️❣️❣️

    今天,作为新一年的第一篇文章,与大家分享关于MySQL事务和隔离级别的知识。在数据库管理系统中,事务是确保数据完整性和一致性的关键机制。通过事务,我们可以将多个数据库操作组合成一个逻辑单元,要么全部执行,要么全部不执行,从而确保数据的正确性和一致性。

    而隔离级别则是控制多个事务并发执行时如何相互影响的关键因素。不同的隔离级别提供了不同的数据可见性和并发性能,需要根据具体的业务需求和性能要求来选择合适的隔离级别。

    一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性、持久性)属性。

原子性(Atomicity)事务开始后所有操作,要么全部做完,要么全部不做不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性(Jsolation)同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

持久性(Durability)事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。小结:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性

总结:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。


          

目录

案例:设置4种隔离级别,分析对mysql的影响。建议设置为read-committed事务级别

级别一:读未提交read-uncommitted:一个事务可以读到另一个事务未提交的结果为脏数据

级别二:读已提交read-committed:只有在事务提交后,其结果才会被其他事务看见

级别三:可重复读repeatable-read:无论事务对数据是否进行操作,事务是否提交,对于同一份数据的读取结果总是相同的。只有退出会话(事务)才能同步数据

级别四:串行化serializable:,隔离级别最高,牺牲了系统的并发性。就是锁表(不是行锁),事务修改表时并没有提交,禁止其他所有事务连接当前表


          

通过现象反映隔离级别效果:

01更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。例:事务A将数值改为1并提交,事务B将数值改为2并提交。这时值变为2。不算问题,正常情况

02脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

03不可重复读(non-repeatable read):同一查询语句在同一事务中多次进行,如果这个过程中其他事务提交了所做的修改或删除,会发生每次返回不同的结果集,此时发生非重复读,那么就是意味着同一事务执行完全相同的select语句时可能看到不一样的结果。导致这种情况的原因可能有:

             (1)有一个交叉的事务有新的commit,导致了数据的改变

             (2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit多个commit提交时,只读一次出现结果不一致

04幻读(phantom read):出现幻读的情况是由于并发事务引起的。在同一个事务内对于相同的查询条件,在两次查询之间新增或删除了符合条件的数据,导致第二次查询结果与第一次查询结果不一致的情况。解决幻读的办法:

            (1)调整事务隔离级别为串行化

            (2)通过间隙锁和next-key locks,而间隙锁和next-key locks只有在隔离级别为可重复读或以上才有(二八定律,RR级别: 20%的事务存在幻读;80%的事务不存在幻读的风险)。在可重复读级别下查询加上for update后如果有数据返回就是行锁,没有数据就加上间隙锁和next-lock key锁住一个范围不允许其他事务DML只能自己才能DML。

例:事务A改了未提交,事务B改其他,A再查。  A把所有‘100’改为‘200’,B把所有‘50’改为‘100’。A查询100,发现还有数据,产生幻读。 RR 级别下存在幻读的可能,但也是可以使用对记录手动加 X锁(RR模式下的X锁会同时进行间隙锁和next-key locks来防止幻读) 的方法消除幻读。SERIALIZABLE 正是对所有事务都加 X锁 才杜绝了 幻读

           

四种隔离级别(MySQL默认Repeated Read,建议改为read committed):

(1)read uncommitted:最低的隔离级别,一个事务可以读到另一个事务未提交的结果为脏数据。

(2)read committed (DEFAULT):只有在事务提交后,其更新结果才会被其他事务看见,解决了更新丢失、脏读。Oracle、db2、sql server默认的隔离级别

(3)Repeated Read(重复读):MySQL默认隔离级别。在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交,它确保同一事务的多个实例在并发读取数据时,看到同样的数据行,只有退出会话(同事务)才能同步数据。解决了更新丢失、脏读、不可重复读。RR 级别下存在幻读的可能,解决幻读的办法:

             (1)调整事务隔离级别为串行化

             (2)通过间隙锁和next-key locks,而间隙锁和next-key locks只有在隔离级别为可重复读或以上才有(二八定律,RR级别: 20%的事务存在幻读;80%的事务不存在幻读的风险)。在可重复读级别下查询加上for update后如果有数据返回就是行锁,没有数据就加上间隙锁和next-lock key锁住一个范围不允许其他事务DML只能自己才能DML

(4)Serializable(串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。就是X锁表(不是行锁),一个事务修改表时并没有提交,禁止其他所有事务连接当前表。SERIALIZABLE 正是对所有事务都加 X锁 才杜绝了 幻读,但很多场景下我们的业务 sql 并不会存在 幻读 的风险。SERIALIZABLE 的一刀切虽然事务绝对安全,但性能会有很多不必要的损失。故可以在 RR 下根据业务需求决定是否加锁,存在幻读风险我们加锁,不存在就不加锁,事务安全与性能兼备,这也是 RR 作为 mysql默认隔是个事务离级别的原因,所以需要正确的理解 幻读。

                   

read committedRepeated Read在处理并发事务时区别

1)"Read Committed" 隔离级别:

每个读操作只能看到已经提交的事务所做的更改,而不能看到其他未提交的事务所做的更改。

事务在读取数据时会对每一行数据加共享锁,直到读操作完成才会释放锁定。

2)"Repeatable Read" 隔离级别:

在事务开始后,所有的查询都只能看到在该事务开始之前已经提交的数据,不会看到其他事务所做的更改。

事务在读取数据时会对整个表加共享锁,直到事务结束才会释放锁定。

总结:

      "Read Committed" 隔离级别只保证读取已提交的数据,可以避免脏读,但可能出现不可重复读和幻读。

     "Repeatable Read" 隔离级别通过在事务期间锁定读取的数据,可以避免不可重复读,但仍可能出现幻读。

      根据具体的业务需求和并发环境来选择合适的隔离级别,如果需要更高的数据一致性和读取的稳定性,可以选择 "Repeatable Read" 隔离级别。如果对一致性要求相对较低,需要更好的并发性能,可以选择 "Read Committed" 隔离级别。

                      

隔离级别相关参数:

mysql> show variables like '%tx_isolation%';     ---默认REPEATABLE-READ对数据不安全。建议修改为READ-COMMITTED

                   

设置隔离级别:

mysql> set global tx isolation='READ-COMMITTED|READ-UNCOMMITTED|REPEATABLE-READ|SERIALIZABLE';
注:在会话和全局级别修改参数,都不会永久修改参数。永久修改参数只能将参数添加到my.cnf文件,然后重启生效。添加参数:transaction-isolation=READ-COMMITTED

                     

案例:设置4种隔离级别,分析对mysql的影响。建议设置为read-committed事务级别

级别一:读未提交read-uncommitted:一个事务可以读到另一个事务未提交的结果为脏数据

mysql> set global tx_isolation='READ-UNCOMMITTED';     ---影响所有会话,但重启失效

mysql> show variables like '%tx_isolation%';  

mysql> set global autocommit=0;       ---关闭自动提交功能。这里只是为了测试,所以关闭了自动提交功能,默认开启

           

会话一:

mysql> create table tb(id int,name varchar(20));
mysql> insert into tb values (1,'itpux1');
mysql> select * from tb;

          

会话二:

mysql> select * from tb;         ---其他会话查到未提交事务的数据

                   

级别二:读已提交read-committed:只有在事务提交后,其结果才会被其他事务看见

mysql> set global tx_isolation='READ-COMMITTED';    ---影响所有会话,但重启失效

mysql> show variables like '%tx_isolation%';  

mysql> set global autocommit=0;       ---关闭自动提交功能。这里只是为了测试,所以关闭了自动提交功能,默认开启

          

会话一:

mysql> create table tb(id int,name varchar(20));
mysql> insert into tb values (1,'itpux1');
mysql> select * from tb;

         

会话二:

mysql> select * from tb; 

        

会话一:

mysql> commit;

         

会话二:

mysql> select * from tb;         ----事务提交后,其他事务才能读取数据

                     

级别三:可重复读repeatable-read:无论事务对数据是否进行操作,事务是否提交,对于同一份数据的读取结果总是相同的。只有退出会话(事务)才能同步数据

mysql> set global tx_isolation='REPEATABLE-READ';    ---影响所有会话,但重启失效

mysql> show variables like '%tx_isolation%';  

mysql> set global autocommit=0;       ---关闭自动提交功能。这里只是为了测试,所以关闭了自动提交功能,默认开启

           

会话一:

mysql> select * from tb;

mysql> update tbset id=1000 where name='itpux1';
mysql> commit;

              

会话二(会话一打开时确保会话二一同打开):

mysql> select * from itpux; 

[root@mysql2 ~]# mysql -u root -p    ---退出会话,相当于结束一个事务。然后重新登录一个会话(同事务)
mysql> select * from tb;        ---查询到其他事务提交的事务

            

级别四:串行化serializable:隔离级别最高,牺牲了系统的并发性。就是锁表(不是行锁),事务修改表时并没有提交,禁止其他所有事务连接当前表

mysql> set global tx_isolation='SERIALIZABLE';    ---影响所有会话,但重启失效

mysql> show variables like '%tx_isolation%';  

mysql> set global autocommit=0;       ---关闭自动提交功能。这里只是为了测试,所以关闭了自动提交功能,默认开启

         

会话一:

mysql> select * from tb;

mysql> update itpux set id=9999 where name='itpux1';

          

会话二:

mysql> select * from tb;          ----查询没有响应。事务级别为串行化,事务没结束之前,对操作的对象进行锁表

           

会话一:

mysql> commit;          ---结束事务(提交事务)

          

会话二:

mysql> select * from tb;   ---事务完成后,其他事务才能读取数据

总结:串行化serializable事务隔离级别,只有读读之间可以并发;读写/写读/写写都要阻塞进行锁表。也就是no MVCC(多版本并发控制)

            

    好啦今天的内容结束了,希望这边文章可以让大家对事务和隔离级别有所了解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 7.0以上charles无法抓取部分https包问题

首先保证配置一切正确 手机通过访问chls.pro/ssl下载.pem证书,如无法安装,在文件管理器中将后缀名改为.crt 在设置中安装该证书 Charles-Proxy - SSL Proxying Setting - Include 添加需要抓包的URL:443即可 以上基本配置结束后,看下代码 代…

彻底解决关于路由的问题,前端路由和服务端路由,history api 和 hash路由

首先路由分成两大块,分别是前端路由和服务端路由,而前端路由又分为两种模式,分别是 histroy api 模式和 hash 模式。 路由 前端路由:指在浏览器中进行路由控制的一种方式,通过监听 url 变化决定加载哪个页面组件或视图…

为什么运维要转行

为什么运维要转行 粉丝提问: 在各种APP里经常看到,趁年轻赶紧远离运维,为什么? 互联网老兵是这样回答的: 运维有很多分类,有干实施运维的,有干交付运维的,也有自动化运维&#xf…

命令行窗口文本复制到 Word 格式保持不变

命令行窗口文本复制到 Word 格式保持不变 References 标题栏右键 -> 编辑 -> 标记 / 全选 标题栏右键 -> 编辑 -> 复制 粘贴到 Notepad 中,语言栏设置对应语言,格式可以保持不变 复制文本粘贴到 Excel 中 选中 Excel 中文本复制&#xf…

数字化转型导师坚鹏:政府数据治理方法及成功案例

课程背景: 很多政府存在以下问题: 不知道如何理解数据治理标准化建设模式? 不清楚如何有效掌握政府数据治理落地技术? 不清楚如何有效学习标杆政府数据治理案例? 学员收获: 深入理解数据治理标准化建设模式。…

在Windows系统上静默安装软件

在Windows操作系统上静默安装软件通常涉及到通过命令行添加特定参数给安装程序,以使得安装过程中不显示用户界面或提示信息,从而实现自动化安装。以下是一些常见的静默安装参数示例: MSI包(Windows Installer)&#xf…

抛弃chatgpt,使用微软的Cursor提升coding效率

Whats Cursor? Cursor编辑器是一个基于GPT-4的代码编辑器,它可以根据用户的自然语言指令或者正在编辑的代码上下文为用户提供代码建议,支持多种编程语言,如Python、Java、C/C#、go等。Cursor编辑器还可以帮助用户重构、理解和优化代码&…

基于PSO优化的CNN多输入时序回归预测(Matlab)粒子群算法优化卷积神经网络时序回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&…

【Flink状态管理五】Checkpoint的设计与实现

文章目录 1. Checkpoint的整体设计2. Checkpoint创建源码解析2.1. DefaultExecutionGraphBuilder.buildGraph2.2. ExecutionGraph.enableCheckpointing 由于系统原因导致Flink作业无法正常运行的情况非常多,且很多时候都是无法避免的。对于Flink集群来讲&#xff0c…

如何在同一个module里面集成多个数据库的多张表数据

确保本公司数据安全,通常对数据的管理采取很多措施进行隔离访问。 但是,Mendix应怎样访问散布于异地的多个数据库呢? 前几期我们介绍过出海跨境的大企业对于Mendix的技术、人才的诉求后,陆陆续续有其他客户希望更聚焦具体的实际场…

springboot+vue的飘香水果购物网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

ip https证书推荐

公网IP地址是每个连接到互联网的设备所必需的标识。公网IP地址是用于在互联网上唯一标识一个设备的IP地址,它由一组由四个数字组成的字符串组成,每个数字在0到255之间。随着互联网的发展,只有公网IP地址的站点也开始重视传输信息安全&#xf…

小脑萎缩怎么办?我们如何战胜这个疾病?

小脑萎缩是一种神经系统疾病,主要表现为小脑功能的进行性退化。这种疾病可能导致患者出现行走困难、平衡障碍、言语不清等症状。近年来,中医治疗小脑萎缩的研究逐渐受到关注,其中刘家峰中医使用中草药治疗小脑萎缩取得了一定的成果。 刘家峰中…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

观察者模式和发布订阅模式的区别

从下图中可以看出,观察者模式中观察者和目标直接进行交互,而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但…

【探究大语言模型中G、P、T各自的作用】

文章目录 前言一、GPT全称二、Generative:生成式三、Pre-trained:预训练四、Transformer:变换模型 前言 偷偷告诉你们,在写这篇文章时,标题就是用chatGPT生成的 一、GPT全称 大语言模型的全称是Generative Pre-train…

[嵌入式AI从0开始到入土]15_orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

同城系统源码_城市o2o系统源码OctShop

同城系统源码O2O的模式就是一种将线下商品或服务与线上互联网相结合,让互联网成为线下交易的前台。比如:商家企业可以通过线上的方式展示自己商品或服务的详细信息,以及各种营销活动的宣传,引导买家消费者下单,通过线上…

Java的String类

目录 String类的常用方法 1.1 字符串构造 1.2 String对象的比较 1.3 字符串查找 1.4 转换 1.5 字符串替换 1.6字符串拆分 1.7 字符串截取 1.8 其他操作方法 1.9 字符串的不可变性 1.10 字符串修改 String类的常用方法 1.1 字符串构造 String类常用的构造方法有很多…

优化|非强凸问题的一阶算法线性收敛条件(一)

原文信息(包括题目、发表期刊、原文链接等):Linear convergence of first order methods for non-strongly convex optimization 原文作者:I. Necoara, Yu. Nesterov, F. Glineur 论文解读者:陈宇文 编者按&#xf…