数据库的读一致性分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

前言

提起数据库的事务,我们就会想到ACID特性:

A:Atomicity 原子性    事务中包含的各种操作,要么一起成功,要么全部失败

C:Consistency 一致性  事务从一个一致性的状态转变成另一个一致性的状态 

I:Isolation 隔离性   各个事务之间的可见程度

D:Durability 持久性  数据库中的数据的改变应该是可以持久存储的

本篇博客将以MySQL为例分析数据库的读一致性。想分析清楚一致性,必先了解隔离级别。


数据库的隔离级别

在SQL标准中是定义了几种隔离级别的:


RU:Read Uncommitted(读取未提交内容)

RC:Read Committed(读取提交内容)

RR:Repeatable Read(可重读)

Serializable(可串行化)


Serializable这种隔离级别最高,若几个事务对同一份数据进行操作(即便是查询操作),它也针对每一个事务进行排序,严格按照排序进行事务的执行,显然解决了事务可能存在的冲突,但是会导致大量的超时以及锁竞争,因此在实际中大多是不会采用此种隔离级别的。

Oracle默认的隔离级别是:RC,并且Oracle只支持RC和Serializable这2种级别。RC,简单一句话,就是一个事务中只能看到另一个事务已经提交的数据的改变。那么RC会带来什么问题呢?在同一事务中,同一条SELECT语句可能会返回不一样的结果,即会产生  不可重复读。


MySQL默认的隔离级别是:RR。在该隔离级别下,可以保证在同一事务中,获取到的数据一致。这就是所谓的MySQL的读一致性,它的实现基于MVCC,后文中会分析。


RU可以让所有事务都读取到其他事务未提交的数据,会带来 脏读,同Serializable一样,在实际中,应用较少。



浅析MySQL MVCC原理

MVCC(MultiVersion Concurrency Control )多版本并发控制,可以简单的理解成为一个row lock的一个变种,只是在必要的时候加行锁。MySQL InnoDB的MVCC简单来讲是通过给表添加两列隐藏列来是实现的。一列是insert/update的时间,另一列是delete的时间,当然这里的时间并不是真正的时间,而是指SVN,即System Version Number,系统版本号,就是一个数字。每次开启一个事务,那么SVN号递增。



现在讨论在REPEATABLE READ下的MVCC实现:


SELECT


  • Innodb查找insert/update SVN小于等于当前事务的SVN的行,如果是小于,说明行之前就已经存在,如果是等于,说明这行是事务本身修改过的。

  • 行的删除时间列要么为空(说明该行未被删除)要么删除时间列的SVN大于当前事物的SVN(表示行是在事物开始之后被删除的)。


只有记录满足以上两条,才会被select语句返回!


这就是为何MYSQL在RR级别下,一个事务中是肯定读取不到“之后建立的”别的事务提交的数据,但是在本事务中更新的数据,可以读取出来的缘故!


INSERT


  • 插入之后以当前事务的SVN号更新创建列


DELETE


  • 删除之后,用当前SVN更新删除列


UPDATE


  • 更新创建列为当前SVN,同时更新删除列为update之前的创建列的SVN值


这样设计的优点是大部分的读操作都不用加锁了,而且是非阻塞的读取操作,使数据库操作简单,性能好,不足之处是增加了存储开销,需要额外的维护工作。


还是那句老话,用空间换取时间!


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1874662,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
135 3
|
3月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
223 6
|
3月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
146 1
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
消息中间件 缓存 监控
如何保证缓存和数据库的一致性?
保证缓存和数据库的一致性的做法
|
关系型数据库 MySQL 分布式数据库
PolarDB 与传统数据库的性能对比分析
【8月更文第27天】随着云计算技术的发展,越来越多的企业开始将数据管理和存储迁移到云端。阿里云的 PolarDB 作为一款兼容 MySQL 和 PostgreSQL 的关系型数据库服务,提供了高性能、高可用和弹性伸缩的能力。本文将从不同角度对比 PolarDB 与本地部署的传统数据库(如 MySQL、PostgreSQL)在性能上的差异。
953 1
|
9月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
10月前
|
存储 数据挖掘 数据处理
2600 万表流计算分析如何做到? 时序数据库 TDengine 助力数百家超市智能化转型
在生鲜超市的高效运营中,实时数据分析至关重要。万象云鼎的“云鲜生”通过智能秤+网关+软件系统的组合,实现了销售数据的精准管理与优化。而在数据处理方面,TDengine 的流计算能力成为了这一方案的核心支撑。本文详细分享了“云鲜生”如何利用 TDengine 高效存储和分析海量销售数据,在优化超市运营、提升用户体验的同时,解决高基数分组、高并发查询等技术挑战。
257 1
|
9月前
|
存储 监控 数据挖掘
消防行业如何借助时序数据库 TDengine 打造高效的数据监控与分析系统
本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时序数据。作者详细阐述了实时监控、报警系统以及历史数据分析在消防行业中的应用,展示了 TDengine 在数据压缩、保留策略和分布式架构下的强大优势。
247 0

热门文章

最新文章