IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL中对于事务的理解 -> 正文阅读

[大数据]MySQL中对于事务的理解

1、什么是事务?

事务:一组逻辑单元,使数据从一种状态变换成另一种状态。

所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久保存下来;要么数据库管理系统将放弃所做的所有修改,整个事务回滚(rollback)到最初状态。

比如:用户AA给用户BB转账100,这就是一个事务,不可分割。也就是AA会减少100,然后BB会增加100,这个操作要么都执行(commit),要么就都不执行(rollback)。

Update account set money = money - 100 where name = ‘AA’;
Update account set money = money + 100 where name = ‘BB’;

事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某一个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。

在MySQL中,只有InnoDB是支持事务的。
事务过程:bejin;数据操作;rollback/commit;
事务的四大特性:原子性,一致性,隔离性,持久性;

2、事务的四大特性ACID

1、原子性(atomicty)
原子性是指事务是一个不可分割的工作单位,要么成功,要么失败,是不存在中间状态的。
2、一致性(consistency)
一致性是指事务执行前后,数据从一个合法性状态变换到另一个合法性状态,这种状态是语义上的,而不是语法上的。
eg:A账户转给B账户50元,此时账户A减少50元,账户B增加59元,但是B账户因为各种意外,余额没有增加。这个时候数据就是不一致的,为什么呢?因为我们定义了一个状态,要求A+B的总余额必须不变。
3、隔离性(isolation)
隔离性是指事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持久性(durability)
持久性是指事务一旦提交,它对数据库中数据的改变就是永久性,接下来的其他操作和数据库故障不应该对其有任何影响。持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候,首先会将数据库的变换信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。

事务的过程如下图,
在这里插入图片描述
那么事务的四种特性是由什么机制实现呢?
事务的原子性、一致性、持久性由redo日志和undo日志来保证的,事务的隔离性是由锁机制实现的。

REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。
UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
REDO日志和UNDO日志都是一种恢复操作,都是InnoDB生成的日志,区别在于:
redo log:记录的是“物理级别”上的页修改操作,比如页号×××,偏移量YYY,写入了"ZZZ"数据,主要是为了保证数据的可靠性;
undo log:记录的是逻辑操作日志,比如对某一行数据进行了SELECT语句操作,那么undo log就记录一条与之相反的DELETE操作。主要用于事务的回滚(undo log记录的是每个修改操作的逆操作)和一致性非锁定读(undo log回滚行记录到某种特定的版本–MVCC,即多版本并发控制)。

3、事务的隔离性

3.1、事务的隔离级别

对于事务的隔离性,其实就是保证如何多并发执行MySQL语句,事务的隔离级别一共分成四种:读取未提交、读取已提交、可重复读、可串行化。在此之前,先介绍一下关于读写操作中出现的一些名词解释:脏写、脏读、不可重复读、幻读。

1、脏写(Dirty write)
对于两个事务Session A、Session B,如果事务Session A修改了另一个未提交事务Session B修改过的数据,那么就意味着发生了脏写,示意图如下:
在这里插入图片描述
2、脏读(Drity read)
对于两个事务Session A、Session B,A读取了已经被B更新但还没有被提交的字段,之后若是B回滚,A读取的内容就是临时且无效的。示意图如下:
在这里插入图片描述
3、不可重复读(No-Repeatable Read)
对于两个事务A、B,A读取了一个字段,然后B更新了该字段。之后A再次读取这个字段,值就不同了。那么就意味着发生了不可重复读。示意图如下:
在这里插入图片描述
4、幻读
对于事务A、B,A从一个表中读取了一个字段,然后B在该表中插入了一些新的行。之后,如果A再次读取同一个表,就会多出几行。那就意味着发生了幻读。示意如下:
在这里插入图片描述
这里面不可重复读是修改了某一字段,幻读是修改了数据的数量。

SQL中的四种隔离级别用来针对上面可能会发生的四种情况:
1、未提交读(READ_UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读;
2、提交读(READ_COMMITTED):允许读取并发事务已经提交的数据,可以阻止脏读,但是不可重复读和仍有可能发生;
3、可重复读(REPEATABLE-READ):对于同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
4、可串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID的隔离级别。所有事务依次逐个执行(事务的执行不存在并行)。

MySQL在InnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重复读)。

3.2、事务的锁机制

我们之前说事务的隔离性是由锁机制实现的,隔离性有四种隔离级别,分别是未提交读、提交读、可重复读、可串行读。那么锁机制又是由什么组成的呢?
在这里插入图片描述
MylSAM和InnoDB存储引擎使用的锁:
MylSAM采用表级锁,InnoDB支持行级锁和表级锁,默认行级锁。
表级锁:开销少,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率低,并发度高。

这里简单介绍表级锁中:读锁和写锁;行级锁中:记录锁、间隙锁、临键锁、插入意向锁。

读锁:也称为共享锁。针对同一份数据,多个事务的读操作可以同时进行而不会相互影响。

写锁:也称为排它锁。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。

记录锁:仅仅把一条记录锁上,对周围数据没有影响。

间隙锁:MySQL在可重复读隔离级别下可以解决幻读问题,解决方案有两种:一种是使用MVCC方案解决,一种是采用加锁方案解决。但是在使用加锁方案中有一个问题,就是事务在第一次执行行读取操作时,那些幻影记录是不存在的,不能给这些幻影记录加上记录锁。因此InnoDB提出一种Gap Locks的锁。

临键锁:临键锁是记录锁和间隙锁的合体,既可以锁住某条记录,也可以阻止其他事务在该记录前面的间隙插入新纪录。

插入意向锁:一个事务在插入记录时需要判断一下插入位置是不是被别的事务加了间隙锁,如果有的话,插入操作需要等待,直到拥有间隙锁的那个事务提交。但是InnoDB规定事务在等待的时候也需要在内存中生成一个锁结构,表明有事务想在某个间隙中插入新纪录,但是现在在等待,官方称之为LOCK_INSERT_INTENTION。插入意向锁是一种间隙锁,不是意向锁,在insert操作时产生。

MySQL在InnoDB存储引擎中是可重复读隔离级别,可以解决脏读、不可重复性读问题,对于幻读问题可以用临键锁和MVCC解决,那么什么是MVCC?以及MVCC的实现原理是什么呢?

3.3、MVCC介绍以及实现原理

MVCC:多版本并发控制,一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。
快照:记录数据库某一个时间点的完全状态。和备份不同,备份是把数据库复制两份,这两份相互独立,快照还是在一个数据库上。

MVCC的实现依赖于:隐藏字段、Undo Log、Read View。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MVCC对还没提交的事务才会生成readview,在可重复读的隔离级别中,只在第一次查询是生成readview,在读已提交的隔离级别中,每次查询都会生成一次新的readview。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 19:08:56  更:2022-06-29 19:12:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 17:10:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码