| |
|
开发:
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 的事务和隔离级别 -> 正文阅读 |
|
[大数据]MySQL - 深入理解 MySQL 的事务和隔离级别 |
Server version: 5.7.36 MySQL Community Server (GPL) MySQL - 深入理解 MySQL 的事务和隔离级别1. 事务的ACID理论1.1 什么是ACID理论?
即在数据库系统中,为了保证一系列数据操作的正确性,可能需要事务的支持,而为了做到功能这么强大的事务,那么这个事务功能就需要支持ACID四个特性。 1.2 ACID的四个特性原子性 - Atomicity
一致性 - Consistency
隔离性 - Isolation
InnoDB 支持的隔离性有 持久性 - Durability
如下图所示,一个“提交”动作触发的操作有:binlog落地、发送binlog、存储引擎提交、flush_logs,check_point、事务提交标记等。这些都是数据库保证其数据完整性、持久性的手段。
1.3 ACID 中 C 与 CAP 定理中 C 的区别?ACID 理论和 CAP 理论都有一个 C,也都叫一致性 ACID 的 CACID 的 C 指的是事务中的一致性,在一串对数据进行修改的操作中,保证数据的正确性。即数据在事务期间的多个操作中,数据不会凭空的消失或增加,数据的每一个增删改操作都是有因果关系的;比如用户A想用户B转了200块钱,不会出现用户A扣了款,而用户B没有收到的情况 CAP 的 CCAP 的 C 则指的是分布式环境中,多服务之间的复制是异步,需要一定耗时的,不是即时瞬间完成。所以可能会造成某个节点的数据修改,将修改的数据同步到其他服务需要一定的时间,如果此时有并发请求过来,请求负载均衡到多个节点,可能会出现多个节点获取的数据不一致的问题,因为请求有可能会落在还没完成数据同步的节点上;而C就是为了做到在分布式集群环境读到的数据是一致的;当然这里的C也有分类,如强一致性,弱一致性,最终一致性 所以: ACID 的 C 着重强调单数据库事务操作时,要保证数据的完整和正确性; 而 CAP 理论中的 C 指的是对一个数据多个备份的读写一致性。 2. 事务的并发问题前面讲到了事务的隔离性,如果要提升系统的吞吐量,当有多个任务需要处理时,应当让多个事务同时执行,这就是事务的并发。既然事务存在并发执行,那必然产生同一个数据操作时的冲突问题,来看一下都会出现什么问题。 更新丢失Lost Update,当两个事务更新同一行数据时,双方都不知道对方的存在,就有可能覆盖对方的修改。比如两个人同时编辑一个文档,最后一个改完的人总会覆盖掉前面那个人的改动。 脏读事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 不可重复读事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。 幻读系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。 小结:不可重复读的和幻读很容易混淆, 3. MySQL 事务的隔离级别以下是SQL-92定义的四种事务隔离级别标准: Read Uncommitted 读未提交限制最弱的事务级别,忽略其他事务放置的锁,该级别下的事务可以在读取其他事务修改后( Read Committed 读已提交Oracle、SQL Server 的默认级别,指定事务执行期间(未提交)不能读取其他事务还未提交的数据, Repeatable Read 可重复读MySQL 的默认级别, Serializable 事务同步,串行化所有的增删改查串行执行。它通过强制事务排序,解决相互冲突,从而
事务隔离级别和锁的关系
4. MySQL SQL命令模拟测试
5. 相关问题5.1 InnoDB 的 RR 级别下其实有部分场景还是会出现不可重复读问题的首先我们都知道标准的SQL定义中,RR级别(可重复读)是能解决不可重复读问题的,即可以避免不可重复读问题;那什么是不可重复读?我们来回忆一下
但事实上MySQL InnoDB引擎下的RR级别的表现是什么呢?我们可以在MySQL InnoDB的
在上表的顺序下,事务B的在事务A提交修改后的快照读是旧版本数据,而当前读是实时新版本实时数据400
这两种场景的唯一区别就是表2中事务B在事务A提交事务前执行过一次快照读,如果我们了解快照读的话,我们就会知道同一事务下,后续快照读的结果会受到前面快照读结果的影响 所以我们可以整理出一下观点:
所以总结:
RR级别以下的RC和RUC级别的本身就会出现不可重复读现象,而S级的串行则连快照读都没有,所以就不再讨论范凑内 5.2 InnoDB 的 RR 级别下是如何避免幻读的?对此我们可以分为表象和内在,表象就是看起来像是什么东西实现的,内在就是实际上是什么实现的,毕竟学习的过程就是透过表象看本质的过程嘛 表象: 学习之前,我们先来了解一下,什么是MySQL InnoDB下的
像select lock in share mode(
像 5.3 Redis 的事务可以实现一致性吗?Redis 的事务,不支持回滚,所以我自身持有的观点,是认为它不能实现对应 MySQL 同等意义的 ACID,这与《Redis设计与实现》所持有的观点稍有不同。 我们可以说 Redis 可以实现 ACID 的 I,但不能实现ACD,为什么呢?
因为Redis的事务可以保证一个客户端一个事务内部的多个操作之间不被其他客户端的操作或同客户端非同事务操作插入,所以他能保证一定程度的事务隔离性;
Redis的事务无法回滚,所以无法做到要么都成功,要么都失败
因为不支持原子性,所以也无法满足事务的一致性,比如一个场景,用户A要给用户B转200块钱,所以事务中有两个操作,操作A将用户A的余额-200,操作B将用户B的余额+200,但是操作A如果某种原因失败了,因为不支持回滚,所以操作B正确进行而且成功了。那么用户A没有扣钱,而用户B却凭空的多了200块钱
虽然Redis支持持久化,但因为Redis的持久化是异步的,无论是RDB还是AOF的方式,Redis都无法保证将某个时间点的数据一字不差的完全持久化。如果某个时刻Redis崩溃,总是有丢失一小段时间的数据的可能 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/23 13:19:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |