分布式数据库-事务一致性

news2024/12/23 17:21:08

version: v-2023060601

author: 路__

一、什么是“强一致性”

分布式数据库的“强一致性”应该包含两个方面:serializability(串行) and linearizability(线性一致),上述图为“Highly Available Transactions: Virtues and Limitations”论文中对于一致性模型的介绍。图中箭头表示一致性模型之间的关系。对于异步网络上的分布式系统,颜色表示每个模型的可用性。本次内容主要围绕“serializability”介绍,从左侧图从我们应该看出了事务的隔离级别,下面我们就从事务入手开始本篇内容。

讲到事务想到的就是“ACID”和“BASA”理论,在NoSQL数据库中base理论应该是比较经典的。

二、事务的介绍

2.1 那么什么是Base呢?

  • BA表示基本可用性(Basically Available):是指某些部分出现故障,那么系统的其余部分依然可用。

  • S表示软状态(Soft State):是指数据处理过程中,存在数据状态暂时不一致的情况,但最终会实现事务的一致性。

  • E表示最终一致性(Eventual Consistency):是指单数据项的多副本,经过一段时间,最终达成一致。

Base其实是一套理论,所以很多实现细节并没有指定,所做的约束也是十分有限。从base的三个特性与ACID相比,我们也感觉到,其理论是在性能和一致性中达到一个平衡。

2.2 ACID是什么呢?

说到ACID我们想到的第一个就是“事务”,“事务”是由多个操作构成的序列。1970年詹姆斯 · 格雷(Jim Gray)提出了事务的ACID四大特性:

  • 原子性(Atomicity):事务中的所有变更要么全部发生,要么一个也不发生。

    介绍:是数据库区别于其他存储系统的重要标志,对于现在阶段的分布式数据库具有挑战,因为网络的不可靠性,所以很多NoSQL数据库都选择跳过这个问题,从对原子性不敏感的细分场景切入。

  • 一致性(Consistency):事务要保持数据的完整性。

    介绍: 可以看做对“事务”整体目标的阐述。

  • 隔离性(Isolation):多事务并行执行所得到的结果,与串行执行(一个接一个)完全相同。

    介绍:其是事务中最为复杂的,隔离性可以分为多个隔离级别,较低的隔离级别就是在正确性上做妥协,从而获得更好的性能。

  • 持久性(Durability):一旦事务提交,它对数据的改变将被永久保留,不应受到任何系统故障的影响。

    介绍: 数据库的基本要求,其核心思想是应对系统故障,我们可以将故障分为两个:

    存储硬件无损、可恢复的故障: 主要依托于预写日志(Write Ahead Log, WAL)保证第一时间存储数据。WAL采用顺序写入的方式,可以保证数据库的低延时响应。

        存储硬件损坏、不可恢复的故障:用到日志复制技术,将本地日志及时同步到其他节点,也即是备份,实现高可用功能,此处为日志备份。

        实现方式大体有三种:

         第一种是单体数据库自带的同步或半同步的方式,其中半同步方式具有一定的容错能力,实践中被更多采用;

         第二种是将日志存储到共享存储系统上,后者会通过冗余存储保证日志的安全性,亚马逊的Aurora采用了这种方式,也被称为Share Storage;

        第三种是基于Paxos/Raft的共识算法同步日志数据,在分布式数据库中被广泛使用。

事务中非常重要的一个特性就是隔离性,下面我们针对性的学习隔离性。

2.3. 隔离性

ANSI SQL-92(简称SQL-92),它定义的隔离级别和异常现象如下所示:

隔离级别脏读 (Dirty Read)不可重复读(Non-Repeatable)幻读 (Phantom)
读未提交(Read Uncommitted)
读已提交(Read Committed)不会
可重复读(Repeatable Read)不会不会
串行化(Serializable)不会不会不会

脏读 (Dirty Read):是一个事务读取了另一个事务未提交的数据。

在不久之后的1995年,Jim Gray等人发表了论文“A Critique of ANSI SQL Isolation Levels”(以下简称Critique),对于事务隔离性进行了更加深入的分析。

2.3.1 Critique

Critique中定义了六种隔离级别和八种异常现象。

快照隔离(Snapshot Isolation, SI)级别:

可以用于解决幻读(Phantom),之前解决幻读问题的就是可串行化。但却无法处理写倾斜(Write Skew)问题,也不符合可串行化要求,有时写倾斜也被称为写偏序,都是一个意思。

因此,今天,使用最广泛的隔离级别有四个,就是已提交读、可重复读、快照隔离、可串行化。

SQL-92没有添加SI的原因是,其出发点是基于锁(Lock-base)的并发控制,而快照隔离的实现基础则是多版本并发控制(MVCC),在现在很多数据都采用了MVCC进行实现,例如图数据库中的TuGraph其采用的便是MVCC。

1.幻读(Phantom)

幻读指在同一事务内多次执行相同查询时,可能会看到不同的行数或记录。幻读也是因为数据库没有对同时进行的事务进行隔离而产生的问题。解决使用表级锁

场景:事务T1使用特定的查询条件获得一个结果集,事务T2插入新的数据,并且这些数据符合T1刚刚执行的查询条件。T2 提交成功后,T1再次执行同样的查询,此时得到的结果集会增大。这种异常现象就是幻读。

幻读与不可重复差异:

  • 相同:都是在一个事务内用相同的条件查询两次,但两次的结果不一样。

  • 差异:

    1.不可重复读来说,第二次的结果集相对第一次,有些记录被修改(Update)或删除(Delete)了;

    2.幻读是第二次结果集里出现了第一次结果集没有的记录(Insert)。幻读是在第一次结果集的记录“间隙”中增加了新的记录。所以,MySQL将防止出现幻读的锁命名为间隙锁(Gap Lock)。

2. 写倾斜

下面通过一个案例来理解写倾斜: 在我们的用户表(user)中有以下数据

id(用户标识)sex(性别)
10
21
30
41

上述0代表女,1代表男,下面我们有两个事务需要并发执行语句如下:

// 语句1: 将表中所有女变成男
begin
update user set sex = 1
where sex = 0
commit
​
// 语句2: 将表中所有男变成女
begin
update user set sex = 0
where sex = 1
commit

在并发执行的情况下,上述结果会发生一半是男一半是女的情况。但是根据可串行化的定义,“多事务并行执行所得到的结果,与串行执行完全相同”,如果按照串行执行,那么要么都是男,要么都是女,这就违背了可串行化的定义了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat优化与动静分离

Tomcat优化 一、Tomcat配置文件参数优化二、负载均衡,动静分离七层代理配置四层代理配置 Tomcat 默认安装下的缺省配置并不适合生产环境,它会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面&…

二、tienchin健身系统技术点复现-注解限流

二、tienchin健身系统技术点复现-注解限流 在上一章节写到编写 lua 脚本。基本的配置类都已经创建,下面创建一个 请求获取IP的工具类和全局异常处理即可。 1、创建工具类IpUtils package com.yangjiapo.rate_limiter.utils;import javax.servlet.http.HttpServlet…

Spark RDD实现分组排行榜

文章目录 一,提出任务二,实现思路三,准备工作1、在本地创建成绩文件2、将成绩文件上传到HDFS上指定目录 四,完成任务1、在Spark Shell里完成任务(1)读取成绩文件得到RDD(2)利用映射算…

kafka系统的架构

系统的架构 主题topic和分区partition topic Kafka中存储数据的逻辑分类;你可以理解为数据库中“表”的概念; 比如,将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic partition分区(提升kafka吞吐量&#…

有以下类定义,写出该类的构造函数,析构函数,拷贝构造函数,要求,所有类对象的空间都是用new动态申请。

有以下类定义&#xff0c;写出该类的构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数&#xff0c;要求&#xff0c;所有类对象的空间都是用new动态申请。 class Stu {string name;int age;int score;int *high; }; #include <iostream> using namespace std; clas…

XSS-labs靶场通关

目录 level 1 ​level 2 level 3 level 4 level 5 level 6 level 7 level 8 level 9 level 10 level 11 level 12 level 13 level 14 level 15 level 16 level 17 level 18 今天就要开始打xss-labs靶场了&#xff0c;点击图片开始吧 level 1 查看源码发现没…

Android系统的Ashmem匿名共享内存子系统分析(3)- Ashmem子系统的 C/C++访问接口

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较…

基于深度学习的高精度人体摔倒行为检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度人体摔倒行为检测识别系统可用于日常生活中或野外来检测与定位人体摔倒行为目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的人体摔倒行为目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

前端学习--Vue3.0(1)

1使用create-vue搭建Vue3项目 1.1 认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了 vite&#xff08;下一代前端工具链&#xff09;&#xff0c;为开发提供极速响应 create-vue基于vite vue-cli基于webpack 1.2 创建项目 需要16.0及以上的node.j…

机器学习笔记:深度学习模型复杂度

1 时间复杂度&#xff08;模型运算次数&#xff09; 决定了模型的训练/预测时间用FLOPs指代 机器学习笔记&#xff1a;FLOPs_flop 机器学习_UQI-LIUWJ的博客-CSDN博客 2 空间复杂度&#xff08;模型参数数量&#xff09; 决定了模型的参数数量 2.1 全连接层参数量 包含bias…

EBU6304 Software Engineering 知识点总结_6 项目管理_下 Design Patterns

Design Patterns Decorator Design pattern 用于扩展系统功能的装饰模式。 比如我们有一个鸭子类&#xff0c;可以调用其鸭子叫的方法。我们初始化了一个鸭子对象&#xff0c;如何统计这个对象叫了几次&#xff0c;也就是其鸭子叫方法被调用了几次&#xff1f;记住OCP原则不…

mysql 在 linux下的安装 和 配置

文章目录 1. linux 安装mysql1. 源码安装1.找到源码包2&#xff1a; 进行配置3&#xff1a;初始化数据目录官方说明 自用4&#xff1a;启动数据库5:写入环境变量 2&#xff1a;使用yum安装1. 直接配置mysql仓库 或者下载MySQL Yum Repository2&#xff1a;安装启动进入mysql 3&…

整理推荐 6 个超好用的平面设计网站!

本文将为大家介绍了 6 个最佳学习平面设计的网站&#xff0c;包括即时设计、Behance、Awwwards、Dribbble、Designinspiration 和 Pinterest。选择学习平面设计网站需要考虑匹配自己的设计风格、是否具有局限性等&#xff0c;可以试用几个网站后选择最合适的。 1、即时设计 即…

我们投出去的简历为什么已读不回?来看面试官如何筛选简历、挑选求职者?

目录 前言&#xff1a; 应届生 1、看学历 2、看实习经历 3、看专业 职场人士 面试官喜欢问什么问题 总结 前言&#xff1a; 金三银四&#xff0c;是求职者蠢蠢欲动的季节&#xff0c;亦是企业摩拳擦掌的季节。 因为作为企业的一名金牌面试官&#xff0c;我收到的内推…

RK1126 C++ yolov5 6.2

基于 rk npu &#xff0c; 实现 yolov5 6.2 模型推理 实现过程 ⚡️​ 编译 opencv 需根据自己路径修改. cmake -D CMAKE_BUILD_TYPERELEASE \-D CMAKE_C_COMPILER./gcc-arm-8.3-2019.02-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \-D CMAKE_CXX_COMPILER./gc…

【Linux】多线程02 --- 线程的同步互斥问题及生产消费模型

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 目录 一、线程互斥1. 为什么要有共享资源临界保护&#xff1f; 2.理解加锁2.1 认识锁&#xff0c;使用锁 线程同步互斥问题是指多线程程序中&#xff0c;如何保证共享资源的正确访问和线程间…

阿里P8大佬七天七夜制作这份自动化核心知识点,错过了就是错过了

整理了一份自动化核心知识点。覆盖了web前端基础&#xff0c;HTML标签&#xff0c;CSS样式&#xff0c;自动化测试工具&#xff0c;webdriver环境搭建&#xff0c;元素定位&#xff0c;手机操作系统&#xff0c;移动自动化测试工具&#xff0c;自动化测试的流程与分类&#xff…

web自动化测试入门篇01——框架介绍

1. 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&#x…

高完整性系统(7)Formal Verification and Validation

文章目录 Specification Process 规格化过程State Invariants案例check ... expect Alloy是一种用于构建和检查抽象模型的语言和工具。当Alloy说所有断言都成立时&#xff0c;这意味着你的模型或规格在给定范围内已成功通过了所有的断言检查。换句话说&#xff0c;对于你所定义…

SOLIDWORKS PDM 独立程序 C#

本主题介绍如何创建登录到 一个 SOLIDWORKS PDM Professional 文件库&#xff0c;并列出根文件夹中的文件。 启动Visual Studio.文件 > 新建 > 项目 > Visual C# > WPF&#xff08;也可以使用WF&#xff09; 输入程序名称选择存储路径确定在解决方案资源管理器中…