数据库的读一致性分析

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
+关注继续查看

前言

提起数据库的事务,我们就会想到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,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 消息中间件 缓存
场景应用:如何保证缓存与数据库的双写一致性?
场景应用:如何保证缓存与数据库的双写一致性?
|
6月前
|
消息中间件 canal 缓存
Redis缓存与数据库双写一致性
Redis缓存与数据库双写一致性
|
12月前
|
消息中间件 存储 缓存
怎么保证缓存和数据库一致性
怎么保证缓存和数据库一致性
怎么保证缓存和数据库一致性
|
缓存 Java 应用服务中间件
如何保证缓存和数据库数据的一致性
如何保证缓存和数据库数据的一致性
93 0
|
消息中间件 缓存 NoSQL
数据库与缓存一致性方案分享
数据库与缓存一致性方案分享
数据库与缓存一致性方案分享
|
消息中间件 canal 缓存
缓存和数据库的数据同步和一致性
首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。
|
SQL Oracle 关系型数据库
超级详细的数据库中的事务机制学习笔记
事务的英文是transaction,从英文中你也能看出来它是进行一次处理的基本单元,要么完全执行,要么都不执行。 事务的特性:ACID……
104 0
|
消息中间件 canal 缓存
缓存与数据库双写一致性深度分析
零基础上手秒杀系统(一):防止超卖零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖零基础上手秒杀系统(三):抢购接口隐藏 + 单用户限制频率零基础上手秒杀系统(四):缓存数据(数据库与缓存一致性实战)(本篇)零基础上手秒杀系统:消息队列异步处理订单...
294 0
|
消息中间件 缓存 NoSQL
缓存与数据库一致性问题深度剖析
本篇文章是我之前系列文章中的一篇,主要讨论了我们在平时的开发过程中,各大系统中都要用到的缓存数据的问题,进一步延伸到数据库和缓存的双写一致性问题,并且给出了所有方案的实现代码方便大家参考。
296 0
|
缓存 NoSQL 安全
如何保障缓存和数据库的一致性(超详细案例)
如何保障缓存和数据库的一致性(超详细案例)
343 0
如何保障缓存和数据库的一致性(超详细案例)
推荐文章
更多