当前位置: 首页 > java >正文

MySQL的事务

一、什么是事务

一个事务是由一条sql或多条sql组成的不可分割的组成单元。事务中的语句要么全部执行,要么全都不执行。

二、事务的特性

事务有四大特点:原子性、一致性、隔离性、持久性

原子性:事务中的操作要么全做,要么全都不做。

一致性:一致性个人理解其实要依赖于原子性,就是事务的状态要从一个一致性状态到另一个一致性的状态。之前的状态和之后的状态的结果都是确定且正确的。

隔离性:事务之间的操作互不干扰。

持久性:事务一旦执行成功,对数据库中的数据的改变时永久的。

三、什么是事务的并发

数据库的并发是指在数据库中的事务的执行并不一定是串行的,可以通过并发执行多个事务来提高事务处理的并行度。但是事务并行过程其实会产生很多的问题,所以就有了事务隔离的级别,通过不同的隔离级别来实现不同程度的并发。当然除了隔离级别,还有其他的并发控制机制来平衡事务的隔离性和并发度。

四、事务并发会产生的问题

事务并发主要会产生四个问题:脏读、不可重复读、幻读、丢失更改。

脏读:就是一个事务读取到了另一个事务未提交时的数据,但是最后这个事务却发生了回滚。这就导致其读到了脏数据。

不可重复读:事务的两次读取结果不一样,可能是由于在执行了一次之后有另外的事务对数据做了更改。

幻读:两次相同事务,第二次的事务读到了第一次事务中没有的数据。

丢失更改:前一个的事务对数据进行了更新,但是后来的事务对这一更新操作做了覆盖,这就是丢失修改。

五、事务的隔离级别

四种隔离级别:读未提交、读提交、可重复读、序列化。不同的隔离级别对应着事务之间的并发程度。

读未提交(read uncommitted):允许一个事务在另一个事务未提交时访问数据。隔离级别最低,并发度最高。

读提交(read committed):在访问同一个数据时,一个事务只能在另一个事务提交之后访问数据。如果不同事务访问的是不同的数据,那还是可以并发的执行的。

可重复读(repeatable read):一个事务多次读取同一条记录,返回的结果是一致的(即使有其他事务对该条记录进行了修改)。

序列化(serializable):要求事务串行,一个一个的执行。串行化要求即使两个事务读取的数据不是同一个,也要一个一个的执行。


六、锁机制

事务的隔离级别主要是通过锁机制来实现的,当然除了锁机制外,现在数据库系统还会结合其他技术(如多版本并发控制MVCC)来优化性能。

(1)、为什么要吃透MySQL锁机制

        在MySQL数据库世界中,锁机制是保障数据库中的数据的一致性与并发控制的核心机制。无论是高并发的电商平台秒杀场景,还是金融系统的交易处理,锁的运用直接决定了系统的性能与数据的安全性。想象一下:当10万个用户同时抢购一个限量的商品时,如何避免超卖?当多个线程并发的修改同一条订单数据时,如何保证数据不出现错乱?这些问题的解决方法都蕴藏在MySQL的锁机制中。

        但同时也要知道,锁机制确实错综复杂,从表级锁到行级锁,从共享锁到排它锁,从乐观锁到悲观锁等等,涉及了众多的新的概念。现在要做的就是一点点的拆解技术,然后对应着各种锁的应用场景来学习并掌握。

(2)、什么是锁?

        锁是数据库系统中用于保障数据的一致性和并发的关键机制。其本质上是一个权限控制机制。当某一个事务获得了某个资源的锁的时候,就是获得了对这个资源的访问权限,其他的事务只有获得了这个权限的时候才能对资源进行操作,否则只能被阻塞或等待,知道资源的锁被释放。

(3)、锁的分类有哪些?

3.1、以操作类型的维度划分

         读锁:查询数据时使用的锁。

         写锁:进行增、删、改操作的时候用到的锁。

3.2、以互斥性的角度划分

        共享锁(S锁):不同的事务之间不会相互排斥,可以同时获取的锁。

         排他锁(X锁):不同的事务之间会相互排斥,同一时间只允许一个事务获取的锁。

 从共享锁和排它锁的兼容性上来看:

3.3、以锁的粒度来划分

         行级锁:每次操作时锁住的是对应的行数据。主要分为3类:

                 记录锁(Record锁):锁定单个行记录的锁,防止其他事务对此行进行更新和删除。

                 间隙锁(Gap锁):锁定索引记录的间隙,左右开区间,确保索引记录的间隙不变化,防止其他事务在这些间隙进行操作。

                 临键锁(Next-Key锁):行锁和间隙锁的组合,同时锁住数据以及数据前面的间隙,左开右闭。

        这只是其简单的解释,每种锁的类型更为详细的解释,见下面的内容。这里有一个不同行级锁类别的数据加锁的示意图:

        页级锁:粒度介于行级锁和表级锁之间,对一次操作及其相邻的记录(一页的数据)进行加锁。但是由于页面锁是Berkeley DB存储引擎支持的一种锁粒度,而这种引擎已经被Oracle收购了,自MySQL5.1以后不再直接性的支持该引擎,因此页面锁见的比较少,了解即可。

        表级锁:每次操作锁住的是整张的表。主要分为3类:

                表锁:分为表共享读锁(read lock)和表独享写锁(write lock)。表共享读锁允许不同事务一块读,不允许不同事务写。表独享写锁加锁之后不允许读也不允许写。

                元数据锁:这里的元数据信息指的是.frm文件中的数据。这个文件就是所有存储引擎存储的表的结构的文件(表的结构包括表结构的定义信息、增删改表的数据信息等)。所以这里的元数据锁就是对存储表的元数据信息的表的锁机制。

                意向锁:分为意向共享锁(IS锁)和意向排他锁(IX锁)。意向共享锁(IS锁):事务打算对表中的某些行加共享锁(S锁),在加S锁之前,先获取该表的IS锁。意向排他锁(IX锁):事务打算对表中的某些行加排他锁(X锁),在加X锁之前,先获取该表的IX锁。【实例】:事务A想对user表中的id=1的行加S锁,它会先获取user表中的IS锁,然后再对id=1的行加S锁。另外一个事务B现在想对这个user表加表级X锁,它会先加测这张表中的锁,发现表上面有IS锁,他就知道了这里面有些行被加了S锁,那么这个事务就会被阻塞。直至IS锁和行级S锁被释放。【好处】:如果没有表级意向锁,那么我在行级加了S锁之后,如果有个事务想加表级X锁,就需要一行一行的扫描看其是否有加锁,这样就会导致资源的拜拜浪费。加上了表级意向锁,就直接知道了这个表里面现在正在进行什么操作。

        全局锁:锁定数据库中的所有的表。加上全局锁之后,整个数据库只允许读,不允许任何的写操作。

 【常见使用场景】:做全库数据的逻辑备份。如果在做全库数据逻辑备份时,如果不加锁,很有可能导致备份的数据库之间不一致。下面的例子就清晰的解释了为什么要逻辑备份:

【加全局锁会出现的问题】:

        如果是在主库上备份,那么在备份期间都不能执行更新操作,业务就只能出于停摆状态。

        如果是在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,导致主从延迟。

3.4、以加锁方式的维度划分

                显示锁:编写SQL语句时,手动指定加锁的粒度。

                隐式锁:执行SQL语句时,根据隔离级别自动为SQL操作加锁。

3.5、以思想的维度划分

                乐观锁:每次执行前认为知己会成功,因此先尝试执行,失败时再获取锁。

                悲观锁:每次执行前都认为自己无法成功,因此先尝试获取锁,然后再执行。

光从分类上就快把自己分废了.......................


        

                

http://www.xdnf.cn/news/18443.html

相关文章:

  • 24.解构赋值
  • 3 种无误的方式删除 Itel 手机上的短信
  • K8S - NetworkPolicy的使用
  • 【小白笔记】 MNN 移动端大模型部署
  • 【普通地质学】构造运动与地质构造
  • unbuntu 20.04 docker 部署wordpress
  • 一体化伺服电机在特种机器人(炉管爬行器)中的应用案例
  • LLM实践系列:利用LLM重构数据科学流程03- LLM驱动的数据探索与清洗
  • 微服务介绍及Nacos中间件
  • 算法 之 拓 扑 排 序
  • Pycharm SSH连接
  • Android15 AndroidV冻结和解冻的场景
  • 学习Linux嵌入式(正点原子imx课程)开发到底是在学什么
  • 【Linux | 网络】多路转接IO之select
  • Python 面向对象编程入门:从思想到属性操作
  • 图(Graph):关系网络的数学抽象
  • 3维模型导入到3Dmax中的修改色彩简单用法----第二讲
  • 零成本加速:EdgeOne免费套餐3分钟接入指南
  • MYSQL库及表的操作
  • 奈飞工厂:算法优化实战 —— 从推荐系统到内容分发
  • Python工程师向项目管理转型的深度分析与学习道路规划
  • 《用餐》,午餐食堂即景小诗分享(手机/小视频/光盘/养生)
  • AI + 云原生 + ITSM 的三重融合:企业数字化转型的新引擎
  • 面试准备革命:面试汪 vs 传统方法,谁更胜一筹?
  • 搭建我的世界mc服务器全流程——阿里云游戏攻略
  • 相似图像处理程序
  • 北京-15k测试-入职甲方金融-上班第二天
  • 哈尔滨云前沿服务器租用类型
  • 高效获取应用程序图标的方法
  • CSS 3D动画,围绕旋转动画Demo