[SQL系列] 从头开始学PostgreSQL 借鉴MYSQL的隔离级别

SQL 的隔离级别是指在数据库中,事务之间相互隔离的程度。当事务 A 修改了某条数据后,如果事务 B 在这个时候读取该数据,会发生什么情况呢?这取决于数据库的隔离级别设置。
常用的事务隔离级别类型包括以下几种:

  1. READ UNCOMMITTED(读未提交):该隔离级别允许读取未提交的事务所做的修改,但未提交的事务不能读取已提交的事务所做的修改。因此,该隔离级别可能会导致脏读和不可重复读的问题。
  2. READ COMMITTED(读已提交):该隔离级别只允许读取已提交的事务所做的修改,而不能读取未提交的事务所做的修改。因此,该隔离级别可以避免脏读的问题,但是可能会导致不可重复读的问题。
  3. REPEATABLE READ(可重复读):该隔离级别允许读取已提交的事务所做的修改,并且同一个事务多次读取同一数据时,其结果保持一致。因此,该隔离级别可以避免不可重复读的问题,但是可能会导致幻读的问题。
  4. SERIALIZABLE(串行化):该隔离级别相当于所有事务都串行执行,可以避免所有的并发问题,但是会严重影响性能。

首先需要了解几个名词:

1. 脏读:在一个事务窗口中,没有数据修改提交前,另一个事务就可以看到内存中数据页的修改。也就是在事务窗口中可以读取到别人没有提交的数据信息。

比如事务A修改了一个数据,但是还没提交

事务B就读取到了这个修改的值

这时候事务A突然间roll back了

事务B就相当于读到了不存在的数据

2. 不可重复读:指的是在一个十五窗口内,最开始独到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。

比如事务A多次读取一个数据,

事务B在其中更新了数据并且提交了

事务A的多次读取结果不一样。

3. 幻读:当事务不是独立执行时,一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。例如,第一个事务读取了表中的所有行,然后第二个事务插入了一行新数据,这导致第一个事务读取的数据行不完整,产生了幻读的现象。

两次select获取到的数量不一样,比如说第一次 select拿到了10行,第二次select有20行。

比如说,事务A第一次select数据时,拿到了5行数据

事务B在此时插入了5行

第二次事务Aselect数据时就拿到了10行数据,要是原本准备从第6行开始insert,这时候就会冲突

隔离级别 脏读不可重复读幻读
读未提交发生     发生发生
读已提交不发生发生发生
可重复读不发生不发生在next-key lock解决
串行读不发生不发生不发生

对于读未提交来说,在事务中修改了数据还没提交但是却会被其他事务所看到

脏读不可避免,不可重复读也是,幻读也是

对于读已提交来说,在事务中修改了数据提交了才会被其他事务看到

脏读完全可以避免,但是如果重复读时正好提交就不对了,所以无法避免不可重复读和幻读

对于可重复读来说,可以避免脏读和不可重复读

Read View是MySQL在可重复读隔离级别下创建的一个视图,它为每个事务提供了一个一致性的数据快照。Read View记录了在事务开始时活跃的所有事务ID。通过Read View,事务可以读取到其他事务修改前的数据行,从而实现可重复读,是为mvcc服务的。

对于串行化,会将所有的事务都串行执行,就可以避免所有的并发问题,但是效率就很低了。

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

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

相关文章

实现langchain-ChatGLM API调用客户端(及未解决的问题)

langchain-ChatGLM是一个基于本地知识库的LLM对话库。其基于text2vec-large-Chinese为Embedding模型,ChatGLM-6B为对话大模型。原项目地址:https://github.com/chatchat-space/langchain-ChatGLM 对于如何本地部署ChatGLM模型,可以参考我之前…

解决代理IP负载均衡与性能优化的双重挑战

在当今数字化时代,代理IP的应用范围日益广泛,它不仅在数据爬取、网络抓取等领域发挥着重要作用,也成为网络安全和隐私保护的有力工具。然而,面对庞大的数据流量和复杂的网络环境,如何实现代理IP的负载均衡和性能优化成…

反复 Failed to connect to github.com port 443 after xxx ms

前提:使用了代理,浏览器能稳定访问github,但git clone一直超时 解决方案: 1. git config --global http.proxy http://127.0.0.1:1080 2. 代理设置端口1080 3. 1080可自定义 感谢来自这篇博客和评论区的提醒:解决…

Flutter 状态组件 InheritedWidget

Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件,InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget,它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget,从而简化了状态管理和数据传递…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中,IOC(Inversion of Control)和DI(Dependency Injection)是密切相关的概念。 IOC(控制反转&a…

常见的远程代码执行漏洞的注入点和注入方式

10个常见的远程代码执行漏洞的注入点和注入方式的举例: 用户输入:当用户输入未经验证和过滤的数据被用于构建动态命令或查询时,攻击者可以通过输入恶意代码来执行远程命令。 文件上传功能:如果文件上传功能没有正确地验证和限制上…

webpack如何实现热更新?

webpack如何实现热更新? 要使用 Webpack 实现热更新,可以按照以下步骤进行配置: 1.在项目中安装 Webpack 和相关的开发依赖: npm install webpack webpack-cli webpack-dev-server --save-dev2.创建一个名为 webpack.dev.js 的…

flask中的蓝图

flask中的蓝图 在 Flask 中,蓝图(Blueprint)是一种组织路由和服务的方法,它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分,可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以…

Qt 调用 Microsoft Excel 组件生成 Excel 文档

在.pro文件中添加模块: QT += core gui axcontainer参考界面:界面中只有一个 pushButton 按钮。 参考代码: mainwindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include

【leetcode】541. 反转字符串 II

给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符…

细讲TCP三次握手四次挥手(一)

计算机网络体系结构 在计算机网络的基本概念中&#xff0c;分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多&#xff0c;在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必…

Unity 性能优化二:内存问题

目录 策略导致的内存问题 GFX内存 纹理资源 压缩格式 Mipmap 网格资源 Read/Write 顶点数据 骨骼 静态合批 Shader资源 Reserved Memory RenderTexture 动画资源 音频资源 字体资源 粒子系统资源 Mono堆内存 策略导致的内存问题 1. Assetbundle 打包的时候…

项目——负载均衡在线OJ

目录 项目介绍开发环境所用技术项目宏观结构编写思路1. 编写compile_server1.1 编译模块编写1.2 运行功能1.3compile_runner 编译与运行1.4 编写compile_server.cpp调用compile_run模块&#xff0c;形成网络服务 2. 编写基于MVC的oj_server2.1 oj_server.cpp的编写2.2 oj_model…

后端性能测试的类型

目录 性能测试的类型 负载测试(load testing) 压力测试(Stress Testing) 可扩展性测试( 尖峰测试(Spike Testing) 耐久性测试(Endurance Testing) 并发测试(Concurrency Testing) 容量测试(Capacity Testing) 资料获取方法 性能测试的类型 性能测试&#xff1a;确定软…

pytorch模型的保存与加载

1 pytorch保存和加载模型的三种方法 PyTorch提供了三种方式来保存和加载模型&#xff0c;在这三种方式中&#xff0c;加载模型的代码和保存模型的代码必须相匹配&#xff0c;才能保证模型的加载成功。通常情况下&#xff0c;使用第一种方式&#xff08;保存和加载模型状态字典…

【Linux下6818开发板(ARM)】硬件空间挂载

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

linux----源码安装如何加入到系统服务中(systemclt)

将自己源码安装的软件加入到系统服务中。例如nginx,mysql 就以nginx为例&#xff0c;源码安装&#xff0c;加入到系统服务中 使用yum安装nginx&#xff0c;自动会加入到系统服务 16-Linux系统服务 - 刘清政 - 博客园 (cnblogs.com) 第一步: 源码安装好nginx之后&#xff0…

【Maven】Maven配置国内镜像

文章目录 1. 配置maven的settings.xml文件1.1. 先把镜像mirror配置好1.2. 再把仓库配置好 2. 在idea中引用3. 参考资料 网上配置maven国内镜像的文章很多&#xff0c;为什么选择我&#xff0c;原因是&#xff1a;一次配置得永生、仓库覆盖广、仓库覆盖全面、作者自用的配置。 1…

JavaSE - Sting类

目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等&#xff08;返回值是boolean类型&#xff09; 2. 比较两个字符串的大小&#xff08;返回值是int类型&#xff09; 3. 字符串查找 &#xff08;1&#xff09;s1.charAt(index) index:下标&…

Vue3中使用pinia

在Vue 3中使用Pinia&#xff0c;您需要按照以下步骤进行设置&#xff1a; 安装Pinia&#xff1a; npm install pinia创建和配置Pinia存储&#xff1a; // main.jsimport { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst app create…